我正在努力从一些我在构建指令的编译函数中构建的html访问隔离范围。我有一个简单的例子,我正在使用的那个更复杂。基本上我无法访问隔离范围的属性。这是代码。
http://plnkr.co/edit/ETIRs4j3EwZ4DFN5XkPc?p=preview
对我来说这很奇怪,因为在后台功能中,范围看起来很棒。
注意如何在编译函数中设置html:
tElement.append(angular.element('<div>{{name}}</div><span>{{value}}</span><span>Hello</span>'))
还要注意第二个指令,这里有一个继承的范围,一切正常。
编辑:我更新了第一个指令(该指令不起作用)来设置html中的属性,以便在我记录范围时可以在控制台中查找它。事实证明它在$ parent范围内(该属性命名为&#34; wat&#34;)。但为什么?这是有道理的,为什么它不起作用,但我不明白为什么HTML不能访问相同的孤立范围?有没有办法强制插入的html使用隔离的范围?
编辑2:好了很多关于我为什么要这样做的问题,可以在这里找到最好的描述。 https://github.com/angular/angular.js/issues/7874。基本上我们想要重复一些被转换的内容,并将项目从ng-repeat暴露给被转换的内容,但是你不能以角度来做,因为被转换的内容只能访问父作用域。
目标是使第一个指令像第二个一样工作,因为两个属性(值和名称)的值在编译函数中附加html,并具有隔离范围。
答案 0 :(得分:0)
这就是我想要实现的目标(我认为)
http://plnkr.co/edit/mL7h7Hf8TkkpfsPNoL6g?p=preview
通过使用带有transclude:true的模板和链接函数,可以在解释角度表达式时用模板替换元素,从而获得所需的结果
您可以使用replace:true来进一步自定义指令
app.directive('widget',function(){
return {
restrict:'E',
transclude: true,
template: '<span ng-bind="wat=\'YES\'"></span><div>{{name}}</div><span>{{value}}</span> <span>There</span>',
scope:{
name:'@',
value:'='
},
link:function($scope, tElement){
}
}
});