AngularJS及其对Dollar变量的使用


128

有谁知道在angularJS中使用美元方法和变量背后的原因是为了指示angularJS避免在进行消化时检查那些值?因此,如果遇到$scope.$valueand时遇到angular $scope.value,那么它将避免检查前者,因为它的变量名前带有美元字符?


另请参阅此博客文章,有关angularjs中“ $ scope”和“ scope”的区别 ……
MarcoS 2014年

19
Angular可能正试图从jQuery中拿走$。
daniel1426

该链接重定向到一个页面,该页面对$ scope的解释不多。
Paul Brannan

5
指令的文档-控制器有$scope,但指令有scope。WTF?
LeeGee

Answers:


87

有时Angular会忽略以美元符号开头的变量:

  1. 在下面Schumli的评论中,json过滤器不会输出它们
  2. 使用{{ }}指令时,angular将不会显示嵌套 $ 变量。例如,这仅显示visible属性。

    <div ng-init="n = { visible: 'foo', $ignore: 'bar' };">{{ n }}</div>
  3. 此外,在范围对象上添加显式监视程序时,对该对象带有前导美元符号的属性的更改将不会触发监视程序。请参阅此更新的小提琴

  4. angular.equals() 忽略以开头的键$


是的,看来您是对的。即使发生点击事件等,它仍然会发生变化。谢谢。
matsko 2012年

7
Angular的某些部分确实会忽略前缀属性,例如'json'过滤器将不会输出以'$'开头的变量。
Schmuli 2012年

116

这只是下面代码段中的命名约定 http://docs.angularjs.org/tutorial/step_05

'$'前缀命名约定
您可以创建自己的服务,实际上,我们将在步骤11中做到这一点。作为命名约定,angular的内置服务,Scope方法和其他一些angular API均带有'$'前缀。在名字前面。在命名服务和模型时,请勿使用“ $”前缀,以避免任何可能的命名冲突。

http://docs.angularjs.org/guide/concepts#angular_namespace

Angular命名空间
为防止意外的名称冲突,Angular为可能会与$冲突的对象的名称加上前缀。请不要在代码中使用$前缀,因为它可能会意外地与Angular代码冲突。


2
为什么指令doc [1] $scope在控制器中却scope在指令中?--- [1] docs.angularjs.org/guide/directive
LeeGee

2
@LeeGee这只是约定。stackoverflow.com/a/19289054/114558
rinogo '16

30

$前缀表示变量,参数,属性,或属于角的核心方法。

源自框架内部但实际上不是API一部分的对象的属性可以以$-甚至$$-表示私有方法或属性开头。这与_其他库中经常使用前缀的方式相同。

尽管框架本身可能赋予它特殊的含义,但它对运行时解释代码的方式没有任何影响。基本上,这是一个命名约定,上面写着“您不应对此感到困惑”。


我想你误会了。在运行时不小心被命名为哪些变量。您可以称之为$$__$_$–它只是一个标识符,对于解释程序没有特殊含义。
dalgard 2015年

我添加了几句话来强调运行时和框架之间的区别;善于改变您的投票。
dalgard 2015年

7

不能完全确定,但是我相信AngularJS内部依赖于在摘要过程中操纵这些带有$前缀的变量。检查这些变量将意味着摘要永远不会稳定,因为它们可能在摘要的每个周期中不断变化。

不过不要在上面引用我。:)


10
投票理由:“不要在上面引用我”。抱歉,但是一个承认不确定性的答案不是一个非常有用的答案:(
David Rivers

2
Downvote转换为up-。假设您是对的,这现在是一个有用的答案!
大卫·里弗斯

2
@DavidRivers,如果答案最初是犹豫不决,则改写它不会使它更有用。实际上,答案可能是错误的,缺乏犹豫会断定潜在的错误。取而代之的是,为了使该答案有用,应该通过引用受信任的来源对其进行备份,或者提供提炼来再现所表达的观点。
Ivaylo Slavov 2014年

1
@IvayloSlavov:我完全同意你的看法。我以为(可能是错误的)回答者再次核实了他是对的,并没有简单地改写答案以消除不确定性。我想我应该有消息来源或小提琴。
David Rivers 2014年

1
@AlexFord:嘿,伙计。谢谢您的道歉!很抱歉,我不清楚,还是开始了所有这些误解。您的观点是正确的,我也同意。我只是想确保自己不会被虚假陈述,但是我不清楚自己的措辞。无论如何,没有难过的感觉,我真的很尊重您能够理解我的观点。干杯,老兄!
David Rivers

5

我一直认为服务$看起来像“ S”。


那是正确的答案。这是合乎逻辑且简单的。这些实际上是服务,因此最好记住$'S'是服务。很好的简单解释。
扬克'16

2
$ scope是一项服务?
死法

5

美元($)符号还可以防止某些指令中的元素被迭代(或解释)。因此,例如,由于for循环的if子句,未使用以$开头的属性: ng-repeat

if(collection.hasOwnProperty(key) && key.charAt(0) != '$')

有人在angulars github页面上对此主题发表了问题


在方法中shallowCopy,由于$$ 子句在迭代属性时会跳过以$$开头的属性:

if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) {

1

@MarcoS提供了指向https://thinkster.io/a-better-way-to-learn-angularjs/scope-vs-scope的链接,该链接解释了$ scope和作用域之间的区别。我发现这很有用,将其添加到其他答案中。

在角度指令中,有一个链接和控制器。链接是一个标准函数,具有一组固定的参数:作用域,元素,属性对象。

控制器的参数由Angular注入器管理,与顺序无关。注入器通过查找以$开头的参数来解析要传入的对象。

https://thinkster.io/a-better-way-to-learn-angularjs/scope-vs-scope的作者做了更好的解释。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.