131

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

4

8 回答 8

119

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

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

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

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

于 2012-11-21T16:30:56.580 回答
89

有几次 Angular 会忽略以美元符号为前缀的变量:

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

    <div ng-init="n = { visible: 'foo', $ignore: 'bar' };">{{ n }}</div>
    
  3. 此外,当在作用域对象上添加显式观察者时,对该对象带有前导美元符号的属性的更改不会触发观察者。看到这个更新的小提琴

  4. angular.equals() 忽略以 . 为前缀的键$

于 2012-09-29T00:09:32.393 回答
32

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

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

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

于 2014-06-09T22:22:01.947 回答
7

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

不过不要引用我的话。:)

于 2012-09-29T00:52:37.293 回答
5

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

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

有人在 angulars github 页面上提出了有关该主题的问题


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

if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) {
于 2014-04-24T08:14:45.400 回答
4

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

于 2014-06-12T02:46:35.540 回答
2

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

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

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

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

于 2017-01-25T06:21:21.740 回答
-1

有很大的不同,不是在变量上,而是在控制器接收的参数上。范围参数与 $scope 参数完全不同。

有关更多信息,请查看这篇有用的帖子:http ://www.thinkster.io/angularjs/aw9kWmdnik/angularjs-scope-vs-scope

于 2014-05-27T16:24:30.373 回答