javascript - 为 Angularjs 指令实现更改处理程序

标签 javascript angularjs angularjs-directive

我正在尝试创建一个自定义指令,它提供与 input 控件类似的更改通知。使用输入控件,您可以执行以下操作:

<input type="text" ng-model="foo" ng-change="bar(a,b)">

在这种情况下,每次foo的值改变时,用ng-change指定的bar函数只会被调用一次。我创建了一个自定义指令,并且想添加相同类型的更改通知。

<div my-directive ng-model="foo" ng-change="bar(a,b)"></div>

我首先尝试将更改处理程序包含在作用域中,然后执行它,但是将其包含在作用域中会导致它在实例化时被调用 12 次,在更改时被调用 12 次,因为我相信这是正在评估属性。

return {
  templateUrl: '...',
  restrict: 'A',
  require: '^ngModel',
  scope: {
    ngModel: '=',
    ngChange: '='
  },
  link: function postLink(scope, element, attrs) {
    if(angular.isFunction(scope.ngChange) {
      scope.ngChange(); // bar is called 12 times
    }
  }
}

然后我查看了 Angular 源代码,发现它们评估了 input 上更改处理程序的属性值。我尝试这样做,但指定的函数似乎从未被调用。

return {
  templateUrl: '...',
  restrict: 'A',
  require: '^ngModel',
  scope: {
    ngModel: '='
  },
  link: function postLink(scope, element, attrs) {
    scope.$eval(attrs.ngChange);  // bar is never called
  }
}

执行此操作的正确方法是什么?

最佳答案

如果您想在每次模型更改时调用 ngChange,您可以监视模型并在监视回调中调用 ngChange

Plunk here

关于javascript - 为 Angularjs 指令实现更改处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23590790/

相关文章:

angularjs - Angular 与 React+Flux 对比表——我的信息正确吗?

angularjs - 自定义行为 - 切换类 - 弹出框 - Angular UI Bootstrap

javascript - $http 请求期间的 Angular UI Bootstrap 模式显示

javascript - 如何通过单击链接制作可扩展的表格?

javascript - 操作 X 和 Y 属性 Unity2D-Javascript

javascript - Meteor wrapAsync 没有在客户端返回值

javascript - 基于 PHP MySQL 表中的值和 JavaScript 值进行选择

javascript - 如何获取刚刚删除的行的文本值-Jquery/Js

javascript - Jasmine - 测试函数调用变量

javascript - onbeforeunload 事件可以通过 $watch 在 angular js 中观看吗?