当前位置: 首页 > 面试题库 >

AngularJS:指令范围内=&@之间的差异?

曾光誉
2023-03-14
问题内容

在指令内部创建 隔离作用域 使我们可以将 外部作用域
映射到 内部作用域 。我们已经看到了六种映射到属性的不同方法:

  1. = attr
  2. &attr
  3. @attr
  4. =
  5. @

这些作用域映射选项分别做什么?


问题答案:

这可能会造成混淆,但是希望有一个简单的示例可以阐明这一点。首先,让我们将模型绑定与行为分开。

这是一个小提琴,应该有助于将它们联系在一起:http :
//jsfiddle.net/jeremylikness/3pvte/

并说明…如果您的指令如下所示:

<my-directive target="foo"/>

然后,您就具有以下范围可能性:

{ target : '=' }

这会将scope.target(伪指令)绑定到$
scope.foo(外部范围)。这是因为=用于双向绑定,当您不指定任何内容时,它将自动将内部作用域中的名称与指令上的属性名称匹配。对scope.target的更改将更新$
scope.foo。

{ bar : '=target' }

这会将scope.bar绑定到$ scope.foo。这是因为我们再次指定了双向绑定,但是告诉指令该属性“ target”中的内容应在内部范围内显示为“
bar”。更改scope.bar将更新$ scope.foo。

{ target : '@' }

这会将scope.target设置为“ foo”,因为@表示“按字面意义”。对scope.target的更改不会在您的指令之外传播。

{ bar : '@target' }

这会将scope.bar设置为“ foo”,因为@从目标属性中获取其值。对scope.bar的更改不会在您的指令之外传播。

现在让我们谈谈行为。假设您的外部范围具有以下内容:

$scope.foo = function(parm1, parm2) { console.log(parm1 + ": " + parm2); }

您可以通过多种方式访问​​它。如果您的HTML是:

<my-directive target='foo'>

然后

{ target : '=' }

将允许您从指令中调用scope.target(1,2)。

一样,

{ bar : '=target' }

允许您从指令中调用scope.bar(1,2)。

更常见的方法是将其确立为行为。从技术上讲,“&”号在父级上下文中评估表达式。那很重要 所以我可以有:

<my-directive target="a+b" />

如果父作用域的$ scope.a = 1和$ scope.b = 2,则在我的指令上:

{ target: '&' }

我可以调用scope.target(),结果将为3。这很重要-绑定作为函数公开给内部范围,但伪指令可以绑定到表达式。

一个更常见的方法是:

<my-directive target="foo(val1,val2)">

然后,您可以使用:

{ target: '&' }

并从指令调用:

scope.target({val1: 1, val2: 2});

这将使用您传递的对象,将属性映射到计算表达式中的参数,然后调用该行为,此例调用$ scope.foo(1,2);。

您也可以这样做:

<my-directive target="foo(1, val)"/>

这会将第一个参数锁定为文字1,并锁定为伪指令:

{ bar: '&target' }

然后:

scope.bar(5)

它将调用$ scope.foo(1,5);



 类似资料:
  • 问题内容: 在下一个稳定的AngularJS发行时,我将应用程序从 1.0.8 迁移到 1.2 。 在AngularJS 1.0.8中 ,可以为诸如的指令设置隔离范围。然后,该指令将使用其自己的功能而不是控制器的功能。 Java脚本 在AngularJS 1.2中, 此行为不再起作用。单击该按钮将立即激活控制器的功能。 参见以下jsFiddle比较: 角1.0.8 角1.2.0 到底发生了什么变化

  • 问题内容: 我创建了一个包装jQuery插件的指令,并将该插件的配置对象从控制器传递到指令。(作品) 在配置对象中是一个我想在事件上调用的回调。(作品) 在回调中,我想修改控制器的$ scope上的属性,该属性 不起作用 。Angular无法识别出该属性由于某种原因而发生了变化,这使我相信回调中的$ scope与控制器的$ scope不同。我的问题是我不明白为什么。 有人能指出我正确的方向吗? 单

  • 问题内容: 我设置了一个范围滑块,范围为0-2hr,时间以分钟为单位计算,然后像这样转换为hh:mm:10min,20min,1hr 20min,2hr。 但是现在我正在尝试使用范围滑块指定的范围来过滤一堆项目,而我很难做到这一点。 这是我所做的http://cdpn.io/LDusa 我正在使用http://danielcrisp.github.io/angular- rangeslider/d

  • 那么,的目的是什么?不能访问通过传递的所有属性。为什么一个max的访问值不能作为而不是 为什么要像那样分配回来? 谢了。

  • 我想查询日期范围内的elasticsearch文档。我现在有两个选择,都很适合我。我已经测试了他们两个。1.范围查询2。距离滤波器 因为我现在有一个小数据集,所以无法测试它们的性能。这两者有什么区别?哪一种方法可以更快地检索文档和响应?

  • 问题内容: 请检查以下代码段: 链接到这里:https : //play.golang.org/p/cdryPmyWt5 上面的代码将检查for循环中的指针和值之间的差异,而go语句也同时使用。对于代码: 我们知道,控制台将打印 三三三 的结果,因为循环运行到其最终的够程开始执行,其中写V作为片的最后一个元素之前。但是指针呢? 好像打印 一二三 ,为什么呢? 谢谢。 问题答案: 答:在调用函数之前