ngChange用于多个ngModel

时间:2016-01-27 08:58:41

标签: javascript angularjs angularjs-directive

如果多个ngModel值中的一个值发生更改而没有添加$scope.$watch,是否可以调用函数?

改变这个:

<div>
    <input ng-model="value1" ng-change="update()">
    <input ng-model="value2" ng-change="update()">
</div>

到此:

<div ng-changes="update()">
    <input ng-model="value1" >
    <input ng-model="value2">
</div>

1 个答案:

答案 0 :(得分:2)

受到ngChange简单实现的启发,您可以遍历子树,收集所有ngModelControllers并在$viewChangeListeners中注册回调。

function ngChanges() {
  return {
    restrict: 'A',
    link: function(scope, element, attr) {
        Array.prototype.forEach.call(element[0].querySelectorAll("*"), function(e) {
            var ngModel = angular.element(e).controller('ngModel');
            if (ngModel) {                
              ngModel.$viewChangeListeners.push(function() {
                scope.$eval(attr.onChanges);
              })
            }
      })
    }
  }
};

Fiddle