Chr*_*ian 13 javascript angularjs angularjs-directive angularjs-scope angularjs-ng-model
如何访问子指令控制器?具体来说,我需要访问父指令中存在的所有ngModelController.例:
<parent-directive>
<input type="text" ng-model="model1"/>
<input type="text" ng-model="model2"/>
</parent-directive>
Run Code Online (Sandbox Code Playgroud)
那么,"parentDirective"是否有办法访问"model1"和"model2"的ngModelControllers?
PSL*_*PSL 11
更新
jqLite extras方法还有一个控制器方法来检索与该元素关联的特定控制器.因此,您可以查询ng-models并获取控制器名称angular.element(el).controller('ngModel').
controller(name) - 检索当前元素或其父元素的控制器.默认情况下,检索与ngController指令关联的控制器.如果name作为camelCase指令名提供,则将检索该指令的控制器(例如'ngModel').
angular还将与元素关联的控制器放在其数据上.类似地,与该指令相关联的ngModel控制器实例是可访问的$ngModelController.因此,您实际上可以访问它并使用ngModel实例来执行您正在执行的操作.然而,这完全是一种非标准的方式,因为$ngModelController没有文档记录,并且无法保证在将来的版本中实现不会改变.
一个示例实现:
.directive('parentDirective', function($timeout){
return{
restrict:'E',
link:function(scope, elm){
/*Get the elements with the attribute ng-model, in your case this could just be elm.children()*/
var elms = [].slice.call(elm[0].querySelectorAll('[ng-model]'), 0);
/*get the ngModelControllerArray*/
var controllers = elms.map(function(el){
return angular.element(el).controller('ngModel');
//return angular.element(el).data('$ngModelController');
});
/*As a sample implementation i am registering a view value listener for these controller instances*/
controllers.forEach(function(ngModel){
ngModel.$viewChangeListeners.push(logViewChange.bind(null, ngModel));
});
function logViewChange(ngModel){
console.log(ngModel.$name, ngModel.$viewValue);
}
}
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10082 次 |
| 最近记录: |