将对象传递给自定义指令而不创建观察者?

时间:2016-03-06 20:31:38

标签: angularjs angularjs-directive watch bindonce

我创建了一个自定义指令("可重用的组件"),它通过绑定到通过HTML参数传递给它的两个对象来创建一个独立的范围。由于我的文档中有多达600个这样的组件,导致1200个观察者和性能不佳,因此很快出现了这个问题。我不需要这些观察者,只需要某种形式的"在传递对象时绑定一次" -functionality。有没有办法实现这个(或解决方法),还是我需要重新设计我的代码?

(将数据作为一个或多个字符串而不是对象传递,是一个非常不可取的选项。)

2 个答案:

答案 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会有所帮助

但是如果值根本不变,那么您应该使用服务将数据与业务逻辑分开