我需要访问由指令创建的模型,同时我需要在指令中获取attrs。
JS:
module.directive('createControl', function($compile, $timeout){
return {
scope: {
name: '=Name' // Dynamically created ng-model in the directive element
},
link: function(scope, element, attrs){
attrs.$observe('createControl', function(){
attrs.createControl //is empty if scope is an object, otherwise it is passed from html attribute
}
}
HTML:
<div class="control-group" ng-repeat="x in selectedControls">
<div create-control="{{ x }}"></div>
</div>
如果将scope
定义为对象,则attrs
为空,否则为从html传递的值。
这种行为的原因是什么?如何访问传递的attrs和模型?
答案 0 :(得分:3)
问题: create-control
需要在父作用域内评估{{x}}
,但是在声明指令时将scope
作为对象,您创建了一个隔离范围。这意味着attrs.createControl
无法访问x
。因此,它是空的。
一个解决方案:您可以通过多种方式解决此问题,其中最好的方法是通过属性将您的指令配置为接受scope.createControl
进入其隔离范围。
工作小提琴: http://jsfiddle.net/pvtpenguin/tABt6/
myApp.directive('createControl', function ($compile, $timeout) {
return {
scope: {
name: '@', // Dynamically created ng-model in the directive element
createControl: '@'
},
link: function (scope, element, attrs) {
scope.$watch('createControl', function () {
// the following two statements are equivalent
console.log(attrs.createControl);
console.log(scope.createControl);
})
}
}
})
答案 1 :(得分:1)
同意Matt,但只有在设置了attrs时,以下两个声明才是等效的。
的console.log(attrs.createControl);
的console.log(scope.createControl);
否则,attrs.createControl
将被取消定义,但scope.createControl
将定义一个函数。
答案 2 :(得分:0)
我需要访问由指令
创建的模型
module.directive('createControl', function($compile, $timeout){
return {
...
require:'ngModel',
link:function(scope, element, attrs, ngMdlCntrl){
//You have the access to the model of your directive here thr. ngMdlCntrl
}
...
}})
需求ng-model
适用于您动态设置的模型。