采用分离范围从内指令$看ngModel($watch ngModel from inside dir

2019-07-19 05:36发布

我想从我的链接函数内部看我的模型值。

scope.$watch(attrs.ngModel, function() {
       console.log("Changed"); 
    });

当我改变我的控制器内的模型值,不会触发$手表功能。

$scope.myModel = "ACT";

$timeout(function() {
   $scope.myModel = "TOTALS"; 
}, 2000);

小提琴: http://jsfiddle.net/dkrotts/BtrZH/4/

我缺少的是在这里吗?

Answer 1:

问题是,你$watch荷兰国际集团attrs.ngModel等于“基于myModel”。 你不必“基于myModel”在你的范围内绑定。 你想$watch “样板”。 这就是在你的指令的范围内绑定。 见http://jsfiddle.net/BtrZH/5/



Answer 2:

你需要看返回你正在观看的$ modelValue的功能。

下面的代码显示一个基本的例子:

app.directive('myDirective', function (){
    return {
        require: 'ngModel',
        link: function(scope, element, attrs, ngModel) {
           scope.$watch(function () {
              return ngModel.$modelValue;
           }, function(newValue) {
               console.log(newValue);
           });
        }
     };
});

这里有一个plunker在行动同样的想法的。



Answer 3:

要做到这一点,正确的方法是:

app.directive('myDirective', function () {
  return {
    require: 'ngModel',
    link: function (scope, element, attrs, ngModel) {

        ngModel.$render = function () {
            var newValue = ngModel.$viewValue;
            console.log(newValue)
        };

    }
  };
});


Answer 4:

这里是另一种方式来做到这一点:

app.directive('myDirective', function (){
    return {
        require: 'ngModel',
        link: function(scope, element, attrs, ngModel) {
           attrs.$observe('ngModel', function(value){ // Got ng-model bind path here
              scope.$watch(value,function(newValue){ // Watch given path for changes
                  console.log(newValue);  
              });
           });
        }
    };
});

做这样你就可以听与像结合价值变动



Answer 5:

这是@以上灵光的答案来回答@马丁贝莱斯的延伸,虽然我知道这是相当晚了! (我也不能作出评论,因此,如果这是不是这样做的正确的地方,对不起!)

我不知道哪个角度OP的版本使用,但在角度#1.2 +至少在官方的文档https://docs.angularjs.org/api/ng/type/ngModel.NgModelController#$render ,$渲染列出这样的:

当调用视图需要更新。 据预计,该NG-模型指令的用户将实现此方法。

在$渲染()方法被调用于以下几种情况:

$ rollbackViewValue()被调用。 如果我们回滚视图值与上次提交的值,那么$渲染()被调用来更新输入控制。 吴模型参考值编程改变,无论是$ modelValue和$ viewValue距离上次不同。 由于NG-模式并不做一次深层的手表,$渲染()只援引$ modelValue和$ viewValue的值从先前的值实际上是不同的。

我解释这意味着到$从指令看的ngModel正确的做法是,要求ngModel和实施注入ngModelController链接功能。 然后使用内置的到$渲染上的变化($表)的ngModel API,或任何其他。



Answer 6:

有2种方式来做到这一点。

1)你可以使用$attrs.[any_attribute]和其上的任何监听器设置

2)你可以已经分离范围有2种方式结合变量,并设置你想要更多吧。如果一个听众,这里是一个很酷的文章

http://www.w3docs.com/snippets/angularjs/bind-variable-inside-angularjs-directive-isolated-scope.html



文章来源: $watch ngModel from inside directive using isolate scope