我创建了一个自定义指令("可重用的组件"),它通过绑定到通过HTML参数传递给它的两个对象来创建一个独立的范围。由于我的文档中有多达600个这样的组件,导致1200个观察者和性能不佳,因此很快出现了这个问题。我不需要这些观察者,只需要某种形式的"在传递对象时绑定一次" -functionality。有没有办法实现这个(或解决方法),还是我需要重新设计我的代码?
(将数据作为一个或多个字符串而不是对象传递,是一个非常不可取的选项。)
答案 0 :(得分:2)
您可以手动评估对象,而无需使用Angular指令范围绑定。假设您有一个指令some-component
,并且您希望在其中传递config
对象,保留隔离的指令范围。你可以这样做:
<some-component config="controller.config"></some-component>
然后指令看起来像这样:
.directive('someComponent', function() {
return {
scope: {
// some bindings, but not config
},
link: function(scope, element, attrs) {
var config = scope.$parent.$eval(attrs.config)
console.log(config)
}
}
})
这里需要 $parent
因为指令范围是隔离的,并且您希望获得在外(父)范围中定义的对象。
尝试一下,看看它是否会对您的设置产生影响。
答案 1 :(得分:2)
您应该使用单向绑定:
scope : {
myField: '&'
....
}
并在指令中使用:
<my-directive my-field="::myDataObjectFromScope"></my-directive>
也许this会有所帮助
但是如果值根本不变,那么您应该使用服务将数据与业务逻辑分开