В чем разница между ng-model и ng-bind
в настоящее время я изучаю AngularJS и испытываю трудности с пониманием разницы между ng-bind
и ng-model
.
может ли кто-нибудь сказать мне, как они отличаются и когда один должен использоваться над другим?
8 ответов
ng-bind имеет одностороннюю привязку данных ($scope --> view). Он имеет ярлык {{ val }}
который отображает значение области $scope.val
вставлено в html, где val
- имя переменной.
ng-model предназначен для размещения внутри элементов формы и имеет двустороннюю привязку данных ($scope --> view и view --> $scope), например <input ng-model="val"/>
.
отстой's ответ попадает в самое сердце вопроса красиво. Вот дополнительная информация....
Фильтры И Форматирования
ng-bind
и ng-model
оба имеют концепцию преобразования данных перед их выводом для пользователя. С этой целью, ng-bind
использует фильтры, а ng-model
использует форматеры.
фильтр (ng-bind)
С ng-bind
, вы можете использовать фильтр в преобразуйте данные. Например,
<div ng-bind="mystring | uppercase"></div>
,
или проще:
<div>{{mystring | uppercase}}</div>
отметим, что uppercase
это встроенный угловой фильтр, хотя вы можете также создайте свой собственный фильтр.
форматирование (ng-модель)
чтобы создать форматер ng-модели, вы создаете директиву, которая делает require: 'ngModel'
, что позволяет этой директиве получить доступ кcontroller
. Для пример:
app.directive('myModelFormatter', function() {
return {
require: 'ngModel',
link: function(scope, element, attrs, controller) {
controller.$formatters.push(function(value) {
return value.toUpperCase();
});
}
}
}
тогда в вашем частичном:
<input ngModel="mystring" my-model-formatter />
это по сути ng-model
эквивалент того, что uppercase
фильтр в ng-bind
пример выше.
Парсеры
теперь, что делать, если вы планируете позволить пользователю изменить значение mystring
? ng-bind
есть только один способ привязки, от модель-->посмотреть. Однако,ng-model
можно связать с посмотреть-->модель что означает, что вы можете разрешить пользователю изменять данные модели, и с помощью парсер вы можете отформатировать данные пользователя в упрощенном виде. Вот как это выглядит:
app.directive('myModelFormatter', function() {
return {
require: 'ngModel',
link: function(scope, element, attrs, controller) {
controller.$parsers.push(function(value) {
return value.toLowerCase();
});
}
}
}
играйте с живым плунжером ng-model
примеры форматирования / парсера
Что Еще?
ng-model
также имеет встроенную проверку. Просто изменить $parsers
или
ngModel
Директива ngModel связывает входные данные, select, textarea (или пользовательский элемент управления формой) со свойством в области.
эта директива выполняется на уровне приоритета 1.
пример Plunker
в JavaScript
angular.module('inputExample', [])
.controller('ExampleController', ['$scope', function($scope) {
$scope.val = '1';
}]);
в CSS
.my-input {
-webkit-transition:all linear 0.5s;
transition:all linear 0.5s;
background: transparent;
}
.my-input.ng-invalid {
color:white;
background: red;
}
HTML-код
<p id="inputDescription">
Update input to see transitions when valid/invalid.
Integer is a valid value.
</p>
<form name="testForm" ng-controller="ExampleController">
<input ng-model="val" ng-pattern="/^\d+$/" name="anim" class="my-input"
aria-describedby="inputDescription" />
</form>
ngModel несет ответственность для:
- привязка представления к модели, которая другие директивы, такие как ввод, textarea или выберите require.
- обеспечение поведения проверки (т. е. требуется, номер, электронная почта, url).
- сохранение состояния элемента управления (допустимый / недопустимый, грязный / нетронутый, коснулся / нетронутый, ошибки проверки).
- установка связанных классов css на элементе (ng-valid, ng-invalid, НГ-грязный, НГ-нетронутый, НГ-тронутый, НГ-нетронутый.) включающий анимации.
- Регистрация элемента управления в родительской форме.
ngBind
Атрибут ngBind указывает Angular заменить текстовое содержимое указанного HTML-элемента значением данного выражения и обновить текстовое содержимое при изменении значения этого выражения.
эта директива выполняется на уровне приоритета 0.
пример Plunker
в JavaScript
angular.module('bindExample', [])
.controller('ExampleController', ['$scope', function($scope) {
$scope.name = 'Whirled';
}]);
HTML-код
<div ng-controller="ExampleController">
<label>Enter name: <input type="text" ng-model="name"></label><br>
Hello <span ng-bind="name"></span>!
</div>
ngBind отвечает за:
- замена текстового содержимого указанного HTML-элемента на значение заданного выражения.
если вы hesiting между использованием ng-bind
или ng-model
попробуйте ответить на эти вопросы:
вы только нужно дисплей данные?
да:
ng-bind
(односторонняя привязка)нет:
ng-model
(двусторонняя привязка)
вам нужно персонализация контента (а не стоимость)?
да:
ng-bind
нет:
ng-model
(вы не должны использовать ng-bind, где требуется значение)
является ли ваш тег HTML
<input>
?
да:
ng-model
(вы не можете использовать ng-bind с входным сигналом tag)нет:
ng-bind
ng-model
директива ng-model в AngularJS является одной из самых сильных для связывания переменных, используемых в приложении, с входными компонентами. Это работает как двусторонняя привязка данных. Если вы хотите лучше понять двухсторонние привязки, у вас есть входной компонент, и значение, обновленное в это поле, должно быть отражено в другой части приложения. Лучшее решение-привязать переменную к этому полю и вывести эту переменную там, где вы хотите чтобы отобразить обновленное значение throughoput приложения.
ng-bind
ng-bind работает сильно отличается от ng-model. ng-bind-это один из способов привязки данных, используемый для отображения значения внутри html-компонента как внутренний HTML. Эта директива не может использоваться для связывания с переменной, а только с содержимым HTML-элементов. Infact это можно использовать вместе с ng-моделью для привязки компонента к HTML-элементам. Эта директива очень полезна для обновления блоки как div, пядь, etc. с внутренним содержимым HTML.
поможет вам понять.
angular.module('testApp',[]).controller('testCTRL',function($scope)
{
$scope.testingModel = "This is ModelData.If you change textbox data it will reflected here..because model is two way binding reflected in both.";
$scope.testingBind = "This is BindData.You can't change this beacause it is binded with html..In above textBox i tried to use bind, but it is not working because it is one way binding.";
});
div input{
width:600px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<head>Diff b/w model and bind</head>
<body data-ng-app="testApp">
<div data-ng-controller="testCTRL">
Model-Data : <input type="text" data-ng-model="testingModel">
<p>{{testingModel}}</p>
<input type="text" data-ng-bind="testingBind">
<p ng-bind="testingBind"></p>
</div>
</body>
ngModel обычно используется для входных тегов для привязки переменной, которую мы можем изменить с контроллера и html-страницы, но ngBind используйте для отображения переменной на html-странице, и мы можем изменить переменную только с контроллера, а html просто показать переменную.
мы можем использовать ng-bind с <p>
для отображения, мы можем использовать сочетание клавиш ng-bind {{model}}
, мы не можем использовать ng-bind с элементами управления вводом html, но мы можем использовать ярлык для ng-bind {{model}}
с элементами управления вводом html.
<input type="text" ng-model="name" placeholder="Enter Something"/>
<input type="text" value="{{name}}" placeholder="Enter Something"/>
Hello {{name}}
<p ng-bind="name"</p>