通常我们在创建指令时使用=
进行双向数据绑定,例如:
app.module('main')
.directive('dirTest'[function(){
return {
scope:{
data:'='
}
}
}])
然后我们可以使用
<dir-test data="xx.data"></dir-test>
要将xx.data
对象传递给指令,但似乎这将使角度观察此表达式。
一旦我不关心数据的变化或数据几乎无法改变,这可能是浪费时间。
这意味着我需要将单向一次性数据传递给指令,这可能吗?
我问这个问题是因为当我打开Batarang控制台时,我发现regularinterceptedexpression
费用太长,看了很多观察者。我认为如果我可以删除一些未使用的观察者,页面可能会运行得很快。
我知道使用@
有从dom到指令的单向,但它似乎只支持字符串。
答案 0 :(得分:2)
在angularjs中,如果你创建一个范围为'@'
的指令,那么它将是Text绑定,这意味着你将能够获得表达式的值但是对它进行更改将不会反映回html page.so我相信如果您使用范围@
创建指令,那么它将为您完成工作。
app.module('main')
.directive('dirTest'[function(){
return {
scope:{
data:'@'
}
}
}]
)
<dir-test data={{xx.data}}></dir-test>
答案 1 :(得分:1)
但是,您可能需要自己评估data
属性并克隆对象。此评估的范围将为scope.$parent
,因为这是数据来源的范围。如果您的指令不需要隔离范围(因此您不在指令中使用scope
配置),则应在scope
中评估该属性:
.directive('dirTest', [function() {
return {
scope: {
something: '=' // something that might need two-way binding
},
link: function(scope, element, attrs) {
scope.data = angular.copy(scope.$parent.$eval(attrs.data));
}
}
}]);
答案 2 :(得分:0)
您可以使用Angular的一次性绑定:
<dir-test data="::xx.data"></dir-test>
请注意,它在Angular 1.3+中可用。有关详细信息,请查看此文章:http://blog.thoughtram.io/angularjs/2014/10/14/exploring-angular-1.3-one-time-bindings.html