4

我正在创建一些具有隔离范围和一些别名属性的指令。例如:

scope: {
   prop1: '@'
}

我的问题是,何时将这些别名添加到范围?我遇到了一些未在链接函数中定义的属性的问题。运行此 jsFiddle 后查看控制台:http: //jsfiddle.net/rvd6x/

当我尝试正常获取该属性时,它没有定义。如果我稍后尝试通过函数 (doStuff()) 获取它,它就在那里。或者如果我$timeout用 0 做 a 它就在那里。显然,我可以使用$timeout. $timeout必须在我的所有指令中注入是一种痛苦。

4

2 回答 2

4

我发现这在指令定义中有效:

scope: {
    prop1: '@'
},
link: function(scope, element, attrs) {
    ...
    attrs.$observe('prop1', function(val) { 
        scope.prop1 = val || 'default'
    });
    ...
}

使

<div my-directive></div>

表现得像

<div my-directive prop1="default"></div>
于 2013-02-02T21:53:03.533 回答
1

这是我的理解:通常在指令中,您不能假设范围内的任何变量都已定义或具有稳定的值。你需要 $watch 任何你感兴趣的东西。

想想 ng-repeat - 你重复的东西在链接时可能不存在,它可能经常改变等等 - 由指令来处理这些场景。

现在我知道这并不能回答您的问题 - 您正在创建一个明确设置范围值的隔离范围,因此直观地说,您所做的与 ng-repeat 示例不同。但看起来 Angular 对待它们是一样的,这可能是一件好事。

根据您需要使用该属性的原因,我认为您可以通过两种方式解决您的问题:

  1. 如果它是一个评估值并且它可能会发生变化,请将其包裹在手表中,以便您做出反应。
  2. 如果它是静态值,您可以使用 attrs.prop1 并将其拉到链接 fn 的开头。

我在这里添加了这两个选项。

于 2012-09-29T20:31:40.437 回答