Почему ngModel $render не вызывается, когда модель изменяется в AngularJS?
DEMO
Почему в следующем примере $render
не вызывается при нажатии кнопки?
<input type="text" ng-model="client.phoneNumber" phone-number>
<button ng-click="client.phoneNumber='1111111111'">Change phone number</button>
.directive("phoneNumber", function() {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, element, attrs, ngModel) {
ngModel.$render = function() {
alert('rendering'); // This is not called
};
}
};
});
Ответы
Ответ 1
Директива input
запускается после вашей директивы, и поэтому она $render
заменяет вашу.
Установите приоритет директивы для чего-то большего, чем 0. Например:
.directive("phoneNumber", function() {
return {
restrict: 'A',
require: 'ngModel',
priority: 1,
link: function(scope, element, attrs, ngModel) {
ngModel.$render = function() {
alert('rendering');
};
}
};
});
И ваш $render
будет иметь приоритет, и вы увидите, что ваше предупреждение вызывается.
Ответ 2
ngModel.$render
работает при вызове $render
в $apply
.
app.directive('changecase', function ($timeout) {
return {
restrict: 'A',
require: 'ngModel',
priority: 1,
link: function (scope, element, attrs, ngModel) {
//format text going to user (model to view)
ngModel.$formatters.push(function(value) {
return value.toUpperCase();
});
//format text from the user (view to model)
ngModel.$parsers.push(function(value) {
return value.toUpperCase();
});
element.on('blur keyup change', function() {
scope.$apply(function(){
ngModel.$setViewValue(ngModel.$modelValue);
ngModel.$render();
});
});
}
}
});