Я сделал директиву, предназначенную для присоединения к элементу с помощью директивы ngModel. Если значение модели соответствует чему-то, тогда значение должно быть установлено на предыдущее значение. В моем примере я ищу "foo" и верну его назад к предыдущему, если это то, что набрало.
Мои модульные тесты прошли отлично, потому что они смотрят только на модельное значение. Однако на практике DOM не обновляется, когда триггеры "возвращают". Наше лучшее предположение заключается в том, что установка старого == 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';
}