angularjs - 如何为自定义指令实现 ng-change

标签 angularjs angularjs-directive angularjs-ng-change

我有一个带有类似模板的指令

<div>
    <div ng-repeat="item in items" ng-click="updateModel(item)">
<div>

我的指令声明为:

return {
    templateUrl: '...',
    restrict: 'E',
    require: '^ngModel',
    scope: {
        items: '=',
        ngModel: '=',
        ngChange: '&'
    },
    link: function postLink(scope, element, attrs) 
    {
        scope.updateModel = function(item)
        {
             scope.ngModel = item;
             scope.ngChange();
        }
    }
}

我希望在单击某个项目并且 foo 的值已更改时调用 ng-change

也就是说,如果我的指令实现为:

<my-directive items=items ng-model="foo" ng-change="bar(foo)"></my-directive>

我希望在 foo 的值更新后调用 bar

使用上面给出的代码,ngChange 被成功调用,但它是用 foo 的旧值而不是新的更新值调用的。

解决该问题的一种方法是在超时内调用 ngChange ,以便在未来某个时刻(当 foo 的值已更改)时执行它。但这个解决方案让我失去了对执行顺序的控制,我认为应该有一个更优雅的解决方案。

我还可以在父作用域中使用 foo 的观察者,但是这个解决方案并没有真正提供要实现的 ngChange 方法,我被告知观察者是伟大的内存消费者。

有没有办法让ngChange同步执行而没有超时或观察者?

示例:http://plnkr.co/edit/8H6QDO8OYiOyOx8efhyJ?p=preview

最佳答案

如果您需要 ngModel,您只需在 ngModelController 上调用 $setViewValue,它会隐式评估 ng-change >。链接函数的第四个参数应该是 ngModelCtrl。以下代码将使 ng-change 适用于您的指令。

link : function(scope, element, attrs, ngModelCtrl){
    scope.updateModel = function(item) {
        ngModelCtrl.$setViewValue(item);
    }
}

为了使您的解决方案发挥作用,请从 myDirective 的隔离范围中删除 ngChange 和 ngModel。

这是一个笨蛋:http://plnkr.co/edit/UefUzOo88MwOMkpgeX07?p=preview

关于angularjs - 如何为自定义指令实现 ng-change,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24754005/

相关文章:

javascript - AngularJS 中的 $scope 没有改变

javascript - 检测指令是否从 DOM 中移除

javascript - AngularJS 中有没有一种方法可以在不使用 $watch 的情况下对模型更改使用react?

javascript - Angular Material 选择重置

javascript - 只执行一个 Angular 运行 block

angularjs - Angular : Returning a $q. defer().promise 而不是 $http promise

javascript - Angular 指令创建 - 使用多个模板

javascript - Rgba 值未以 ng 样式更新

javascript - 从 Angular 选择框中再次选择 "selected element"

javascript - Ng-Class 导致页面首次加载时两个类处于事件状态