如何在AngularJS指令中访问控制器关联的ng-model?
能不能在AngularJS指令中访问控制器关联的ng-model?
当然可以实现,但你当前的指令配置有个小问题——你用了独立作用域scope: {},这会让指令的作用域和控制器的作用域完全隔离,所以直接在link函数里写scope.valuelist.value肯定拿不到控制器里的ctrl.valuelist.value。下面给你两种常用的解决办法:
方法一:让指令作用域继承控制器作用域
把指令的scope配置改成scope: true,这样指令会创建一个继承自控制器作用域的子作用域,就能直接访问到控制器里的ctrl实例了:
function Directive($window) { return { restrict: 'E', scope: true, // 改成继承作用域 controller: 'ctrl as ctrl', link: function(scope, elt, attrs){ // 现在可以直接访问控制器的model了 scope.ctrl.valuelist.value = 'New value'; } }; }
这种方法适合指令和控制器在同一个上下文里,需要共享作用域的场景。
方法二:通过双向绑定传递ng-model
如果你的指令需要更灵活(比如要和不同的model绑定),可以把ng-model作为参数双向绑定到指令的作用域里:
第一步:修改指令的作用域配置
function Directive($window) { return { restrict: 'E', scope: { myModel: '=' // 定义双向绑定的属性 }, controller: 'ctrl as ctrl', link: function(scope, elt, attrs){ // 直接修改绑定的model scope.myModel = 'New value'; } }; }
第二步:在HTML中传递ng-model
<input type="text" ng-model="ctrl.valuelist.value" /> <!-- 把控制器的model传给指令 --> <my-directive my-model="ctrl.valuelist.value"></my-directive>
这种方法更符合指令的复用性原则,推荐在需要通用指令的时候使用。
另外要注意,你用了controller as ctrl的语法,所以控制器里的属性都是挂在ctrl实例上的,不管哪种方法,访问的时候都要带上ctrl前缀(除非你把属性直接挂在$scope上,但controller as是更推荐的写法)。
内容的提问来源于stack exchange,提问作者Nima Parsi
相关产品推荐
相关产品推荐

