我有一个指令mydiv
,它在其中嵌入了另一个指令myspan
。所以我的index.html看起来像:
<mydiv></mydiv>
,mydiv
的模板如下:
<div>
<myspan><myspan>
</div>
和myspan
只是:
<span>asdf</span>
现在我想动态地将变量传递给myspan
指令,所以我在mydiv
中做了类似的事情:
<div>
<myspan data-text="hello"><myspan>
</div>
并使用指令链接函数将其添加到myspan
控制器作用域(它基本上采用所有“data- *”属性并将其设置在作用域上):
link: function(scope, elem, attrs){
for(var attr in attrs) {
scope[attr] = attrs[attr];
}
}
最后,myspan
模板如下所示:
<span>{{text}}</span>
并且效果很好。
问题
我现在想要从mydiv
模板中添加myspan
到mydiv
的范围变量,所以我会执行以下操作:
<div>
<myspan data-text="hello" data-scopevar="{{mydivText}}"><myspan>
</div>
但是,这不起作用,“{{mydivText}}”在传递之前永远不会被编译。我认为这是因为myspan
指令在mydiv
之前被初始化,因此mydivText
还没有准备好。
问题
答案 0 :(得分:1)
首先,这是将变量传递给嵌入式指令的正确方法吗?
这一切都取决于您的mydiv
和myspan
指令指定的范围类型。他们是使用父范围,创建新的子范围还是使用隔离范围?
如果你的指令没有创建新的作用域,那么这两个指令都可以访问父作用域中定义的所有属性,因此你不需要传递任何东西。
根据您当前的实施,使用{{}}
,您必须使用$observe
来获取插值:
link: function(scope, elem, attrs) {
for(var attr in attrs) {
if(attrs !== 'scopevar') {
scope[attr] = attrs[attr];
}
}
attrs.$observe('scopevar', function(value) {
scope['scopevar'] = value;
})
}