angularjs – $watch只在内部指令中触发一次

前端之家收集整理的这篇文章主要介绍了angularjs – $watch只在内部指令中触发一次前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是角度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时,观察模型更改的标准方法是创建格式化程序:
link: 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;
});

Working Plunker

我建议您阅读ngModelController文档,以便准确了解这些管道的工作原理.

但是,如果您想要做的只是在模型更改时得到通知(您不希望或不需要格式化或解析任何内容),那么您可以做一些更简单的事情:

scope: { model: '=ngModel' },link: function(scope) {
    scope.$watch('model',function(value) {
        // Do something with value
    });
}

Working Plunker

但是根据你的指令名称formValid,我认为使用ngModelController是正确的方法.

UPDATE

值得一提的是,ngModelController可能存在一个缺点:它与“引用”类型(例如数组,对象)的效果不佳.更多细节可以在here找到.

原文链接:https://www.f2er.com/angularjs/141223.html

猜你在找的Angularjs相关文章