Я создал директиву, предназначенную для прикрепления к элементу с помощью директивы ngModel. Если значение модели соответствует чему-то, значение должно быть установлено на предыдущее значение. В моем примере я ищу «foo» и возвращаю его к предыдущему, если это то, что введено.
Мои модульные тесты прошли нормально, потому что они рассматривают только значение модели. Однако на практике DOM не обновляется, когда срабатывает «возврат». Наше лучшее предположение здесь заключается в том, что установка old == new предотвращает грязную проверку. Я прошел через метод $setViewValue, и, похоже, он делает то, что должен. Однако он не будет обновлять DOM (и то, что вы видите в браузере), пока я явно не вызову ngModel.$render() после установки нового значения. Он отлично работает, но я просто хочу посмотреть, есть ли более подходящий способ сделать это.
Код ниже, вот скрипка с тем же самым.
angular.module('myDirective', [])
.directive('myDirective', function () {
return {
restrict: 'A',
terminal: true,
require: "?ngModel",
link: function (scope, element, attrs, ngModel) {
scope.$watch(attrs.ngModel, function (newValue, oldValue) {
//ngModel.$setViewValue(newValue + "!");
if (newValue == "foo")
{
ngModel.$setViewValue(oldValue);
/*
I Need this render call in order to update the input box; is that OK?
My best guess is that setting new = old prevents a dirty check which would trigger $render()
*/
ngModel.$render();
}
});
}
};
});
function x($scope) {
$scope.test = 'value here';
}