【问题标题】:angularjs : logging scope property in directive link function displays undefinedangularjs:指令链接函数中的日志范围属性显示未定义
【发布时间】:2013-01-11 04:48:50
【问题描述】:

我有这个基本的plnkr,它只是实现了一个基本的“Hello,X”指令。 在链接功能中,我正在记录scope.name,但我得到undefined?为什么会这样?它不应该在控制台中记录name属性的值吗?

【问题讨论】:

    标签: angularjs javascript-framework


    【解决方案1】:

    这是一个已知的“问题”,@ 属性的插值发生在调用链接函数之后。有一个pull request open 来改变这个问题,但不清楚这个是否会被合并。

    与此同时,获取插值的一种方法是通过观察如下属性:

    attrs.$observe('hello', function(changedValue){
         console.log(scope.name);
    });
    

    还有笨蛋:http://plnkr.co/edit/Lnw6LuadTLhhcOTsPC8w?p=preview

    因此,归根结底,AngularJS 的这种行为有点令人困惑,将来可能会改变。

    【讨论】:

    • 好的...所以,由于{{ }} 表达式尚未计算,在链接阶段,它返回未定义。但是,使用常量字符串而不是插值会返回正确的值。
    • 在这种情况下,“@myAttr”是否有用?我不得不改用 attrs 变量,感觉有点草率..
    • 我不知道我是怎么来到这里的,只是补充一下,截至今天,"@" 属性的插值发生在调用链接函数之前。请参阅this 的帖子。
    【解决方案2】:

    Pawel 是对的 (https://stackoverflow.com/a/14552200/287070) 但我想补充一点,问题是任何包含 {{}} 插值的属性都将在链接函数期间的 attrs 参数中设置为 null,作为自尚未运行编译来评估这些。

    @bindings 在链接函数中为 null 的事实只是一个症状。

    目前还没有真正的修复,因为我们无法在编译过程中开始运行 $digests。因此,$observe(或 $watch)是获取这些值的唯一真正方法。

    【讨论】:

    • 这似乎令人困惑,因为它也会影响不使用插值的属性。我只是想通过 DOM 属性字符串将参数传递给指令,没什么花哨的,但我必须使用 $observe 才能实际获取该值这一事实非常不直观。
    【解决方案3】:

    对于那些在 2015 年阅读这篇文章的人,请注意 Angular 处理 "@" 属性的方式已经改变。 从 Angular 1.2 开始,插值发生在调用链接函数之前。

    present here 是一个关于这个主题的优秀帖子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多