【问题标题】:directive scope two way binding not working using "="指令范围双向绑定不使用“=”
【发布时间】:2014-05-25 10:43:35
【问题描述】:

我有这个非常简单的指令。

you can find the code here

在代码中,

我已使用“@”作为范围内的链接。 我能够正确地得到它。

但这不是双向绑定,所以我尝试在范围内使用“=”。

这部分似乎没有反映在我的模板中。我试着看看链接变量是否 存在于范围内,似乎未定义。

这个指令应该放在控制器中吗?

我的代码中缺少什么。

【问题讨论】:

    标签: angularjs angularjs-directive angularjs-scope


    【解决方案1】:

    您似乎忽略了 @= 绑定之间的区别。虽然这 2 个可能看起来相似,但它们是桥接“指令世界”与“页面世界”的根本不同方式。

    首先,让我们从相似之处开始:两种类型的绑定都允许您将数据从使用指令的页面传递到指令本身(指令内部范围)。但这就是相似之处的结束,差异列表如下所示:

    • = 是一种双向数据绑定,可以以两种方式跨越页面/指令世界:从页面到指令以及从指令范围到页面范围。另一方面,@ 只允许您将数据从页面传递到指令,而不允许从指令传​​递到页面。
    • = 绑定允许您传递在作用域上定义的数据 - 即 - 任何 JavaScript 变量(基元、数组、对象)。 @ 不同,它通过 DOM 属性传递数据。因此,这些属性仅限于字符串。
    • 鉴于上述情况,=@ 的触发方式也与使用指令的页面不同:对于 =,我们需要传递一个 表达式,该表达式指向范围上定义的数据 而对于@,我们正在通过DOM,需要使用插值指令({{foo}})来访问范围内可用的数据。

    在所有这些解释之后,您可以看到在指令定义中使用 = 我们需要传递一个 表达式 所以如果您这样做:<mydirective link="link1" group="main"></mydirective> 您实际上是在说:传递给指令在作用域上定义的 link1 变量的值。由于未定义此类变量,因此您将 undefined 传递给指令。

    因此,如果您打算传递一个常量(我假设您想要这样做),您需要编写:

    <mydirective link="'link1'"  group="main"></mydirective>
    

    这是一个有效的 plunk:http://plnkr.co/edit/M3qL4MdmoWjTWzZGkwz0?p=preview

    【讨论】:

    • 当然,使用 2-way 数据绑定 (=) 绑定到字符串常量是多余的。这更适合@,对吧?
    • 是的.. 我猜@pkozlowski.opensource 只是想让我了解其中的区别。
    【解决方案2】:

    大多数人忘记的一件事是,您不能只使用对象表示法声明一个孤立的范围,并期望绑定父范围的属性。这些绑定只有在声明了绑定“魔术”的属性时才有效。查看更多信息:

    https://umur.io/angularjs-directives-using-isolated-scope-with-attributes/

    【讨论】:

      猜你喜欢
      • 2015-10-29
      • 1970-01-01
      • 2015-01-04
      • 2015-03-07
      • 2014-04-28
      • 1970-01-01
      • 2018-08-23
      相关资源
      最近更新 更多