angularjs – 如何实现自定义指令的ng更改
我有一个指令与一个模板
<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更改工作。
link : function(scope,attrs,ngModelCtrl){ scope.updateModel = function(item) { ngModelCtrl.$setViewValue(item); } } 为了使您的解决方案工作,请从myDirective的隔离范围中删除ngChange和ngModel。 这里是一个plunk:http://plnkr.co/edit/UefUzOo88MwOMkpgeX07?p=preview (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |