Angularjs 将对象传递给指令而不监视它们
通常,我们在创建指令时使用Angularjs 将对象传递给指令而不监视它们,angularjs,angularjs-directive,Angularjs,Angularjs Directive,通常,我们在创建指令时使用=进行双向数据绑定,例如: app.module('main') .directive('dirTest'[function(){ return { scope:{ data:'=' } } }]) 然后我们可以使用 <dir-test data="xx.data"></dir-test> 将xx.data对象传
=
进行双向数据绑定,例如:
app.module('main')
.directive('dirTest'[function(){
return {
scope:{
data:'='
}
}
}])
然后我们可以使用
<dir-test data="xx.data"></dir-test>
将xx.data
对象传递给指令,但这似乎会使angular监视此表达式
一旦我不在乎数据的变化,或者数据几乎不能改变,这可能是浪费时间
这意味着我需要一个单向一次性数据传递到指令,这可能吗
我问这个问题是因为当我打开Batarang控制台时,我发现
正则InterceptedExpression
花费的时间太长,而且观察者很多。我认为如果我可以删除一些未使用的观察者,页面可能会运行得很快
我知道使用
@
可以实现从dom到指令的单向转换,但它似乎只支持字符串。您可以使用Angular的一次性绑定:
<dir-test data="::xx.data"></dir-test>
请注意,它在Angular 1.3+中可用。查看本文了解更多详细信息:这是可能的,但是您需要评估
数据
属性并自己克隆对象。此评估的范围将是scope.$parent
,因为这是数据来源的范围。如果您的指令不需要隔离作用域(因此您不在指令中使用scope
config),则应在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));
}
}
}]);
演示:在angularjs中,如果创建范围为“
@”
的指令,则它将是文本绑定,这意味着您将能够获得表达式的值,但对其进行更改不会反映回html页面。因此,我相信,如果您使用scope@
在中创建指令,那么它将为您完成任务
app.module('main')
.directive('dirTest'[function(){
return {
scope:{
data:'@'
}
}
}]
)
在这种情况下,不幸的是:
不会有帮助,因为在指令作用域配置的情况下,双向绑定的设置是不同的。这里有一个演示:这是正确的答案。OP犯的错误是认为只能向'@'指令作用域属性提供字符串。
<dir-test data={{xx.data}}></dir-test>