什么时候隔离范围属性实际上被添加到范围?

时间:2012-09-28 19:10:56

标签: javascript angularjs

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

scope: {
   prop1: '@'
}

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

当我试图让房产正常时,它没有被定义。如果我稍后通过函数(doStuff())尝试获取它,它就在那里。或者,如果我用$timeout做0,那就在那里。显然我可以使用$timeout来解决我的问题,但我想知道为什么我不能仅仅期望范围已经在链接函数中立即拥有它。在我的所有指令中注入$timeout是一种痛苦。

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

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

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

现在我知道这没有回答你的问题 - 你正在创建一个明确设置范围值的独立范围,所以直观地说你所做的与ng-repeat例子不同。但看起来Angular对待它们是相同的,这可能是一件好事。

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

  1. 如果它是评估值并且可能会更改,请将其包装在手表中 所以你可以做出反应。
  2. 如果它是静态值,您可以使用attrs.prop1和 在你的链接fn开头把它拉下来。
  3. 我已将这两个选项添加到小提琴here