【问题标题】:AngularJS best practice to inherit scope in directiveAngularJS 在指令中继承范围的最佳实践
【发布时间】:2013-01-23 08:57:12
【问题描述】:

从 Directives 文档中它说以这两种方式继承范围:

@ 或 @attr - 将本地范围属性绑定到 DOM 的值 属性。结果总是一个字符串,因为 DOM 属性是 字符串。如果未指定 attr 名称,则属性名称为 假定与本地名称相同。范围的给定和小部件定义:{ localName:'@myAttr'}, 然后小部件范围属性 localName 将反映插值 你好 {{name}} 的值。随着名称属性的变化, 小部件范围上的 localName 属性。该名称是从 父范围(不是组件范围)。

= 或 =attr - 在本地范围属性和通过值定义的名称的父范围属性之间设置双向绑定 attr 属性。如果未指定 attr 名称,则属性 假定名称与本地名称相同。范围的给定和小部件定义:{ localModel:'=myAttr' },然后小部件范围属性 localModel 将 在父作用域上反映 parentModel 的值。任何更改 parentModel 将反映在 localModel 和任何更改 localModel 将反映在 parentModel 中。

考虑到我要传递elementId,它只是一个id,我可以通过=elementId或@elementId传递。

现在这两者中的哪一个被认为是最佳实践?如果我使用 @ 和属性,它会从 DOM 中获取值,这比直接获取值要慢?

我说的对吗?有什么建议吗?

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:
    • 如果指令需要更改值,使用 = 来获得双向绑定。
    • 如果您想让其他阅读您的代码的人清楚您只使用单向绑定,请使用@。
    • 如果您需要同步访问链接函数中的值,请使用 =(请参阅关于 @ 和 $observe 的异步行为的注释 here)。

    对于您的情况,@ 似乎是最好的。 (不过,如何在 HTML 元素中使用指令和 elementID 的示例会很有帮助。)

    我不知道哪个更慢/更快。

    另见What is the difference between '@' and '=' in directive scope in AngularJS?

    【讨论】:

    • +1 我要补充...“如果您遇到内存问题,请不要隔离范围,而是在链接函数中手动设置 $watches 和 DOM 操作”。
    • @blesh,说得好。我应该提到您不必使用隔离范围 (scope: { ... }) 甚至非隔离的新范围 (scope: true) - 您可以使用现有范围。
    • 我认为隔离范围使其可重用:)
    猜你喜欢
    • 2015-02-04
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 2014-11-07
    • 2021-06-24
    • 1970-01-01
    相关资源
    最近更新 更多