我制作了一个指令,旨在使用 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';
}