我是角度js的新手,所以请一些人帮帮我.我的模板在这里:
<form ng-model="signup" form-valid> <input type="text" name="username" ng-model="signup.username">{{signup}} </form>
我的指示是这样的:
app.directive("formValid",function(){ return { restrict:"A",require:"ngModel",link:function(scope,element,attrs){ scope.$watch(attrs.ngModel,function(newValue){ if(newValue){ console.log(newValue); } }); } }});
当我在文本框中输入一些值时,模型正在改变,因此“$watch”应该被触发.但是在这里“$watch”只在我第一次在文本框中输入任何值时被触发一次.谢谢预先.
使用ngModelController时,观察模型更改的标准方法是创建格式化程序:
原文链接:https://www.f2er.com/angularjs/141223.htmllink: function(scope,attrs,ngModelCtrl) { ngModelCtrl.$formatters.push(function(value) { // Do something with value return value; }); }
请记住,仅在直接更改模型时才会触发格式化程序.如果更改来自UI(即用户更改某些内容),则会触发解析器.所以你可能也需要这样做:
ngModelCtrl.$parsers.push(function(value) { // Do something with value return value; });
我建议您阅读ngModelController文档,以便准确了解这些管道的工作原理.
但是,如果您想要做的只是在模型更改时得到通知(您不希望或不需要格式化或解析任何内容),那么您可以做一些更简单的事情:
scope: { model: '=ngModel' },link: function(scope) { scope.$watch('model',function(value) { // Do something with value }); }
但是根据你的指令名称formValid,我认为使用ngModelController是正确的方法.
UPDATE
值得一提的是,ngModelController可能存在一个缺点:它与“引用”类型(例如数组,对象)的效果不佳.更多细节可以在here找到.