【问题标题】:AngularJS and its use of Dollar VariablesAngularJS 及其对美元变量的使用
【发布时间】:2021-10-26 22:59:21
【问题描述】:

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

【问题讨论】:

  • 另请参阅difference of "$scope" and "scope" in angularjs@ 上的此博客文章...
  • Angular 可能正试图从 jQuery 中拿走 $。
  • 该链接重定向到一个对 $scope 没有太多解释的页面。
  • 指令的文档——控制器有$scope,但指令有scope。什么鬼?

标签: angularjs


【解决方案1】:

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

  1. Schumli's comment下面,json过滤器不会输出的地方
  2. 使用{{ }} 指令时,角度不会显示嵌套 $ 变量。例如,这仅显示 visible 属性。

    <div ng-init="n = { visible: 'foo', $ignore: 'bar' };">{{ n }}</div>
    
  3. 此外,在作用域对象上添加显式观察程序时,对该对象前导美元符号的属性的更改不会触发观察程序。见this updated fiddle

  4. angular.equals()ignores keys prefixed with $.

【讨论】:

  • 是的,看起来你是对的。即使有点击事件等等,它仍然会发生变化。谢谢。
  • Angular 的某些部分会忽略前缀属性,例如“json”过滤器不会输出以“$”开头的变量。
【解决方案2】:

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

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

【讨论】:

  • 投反对票是因为:“不要引用我的话”。抱歉,承认不确定性的答案不是很有用:(
  • 反对票转换为赞成票。假设你是对的,现在这是一个有用的答案!
  • @DavidRivers,如果答案最初是犹豫的,那么重新措辞不会使它更有用。事实上,答案可能是错误的,而毫不犹豫会断言潜在的错误。相反,为了使这个答案被认为是有用的,它应该通过引用 trusted 来源提供一些证据来支持它,或者提供一个小提琴来重现表达的观点。
  • @IvayloSlavov:我完全同意你的看法。我假设(可能是错误的)回答者仔细检查了他是对的,并且没有简单地改写答案以消除不确定性。我想我应该想要资源或小提琴。
  • @AlexFord:嘿,伙计。谢谢你的道歉!对不起,我不清楚,无论如何都开始了所有这些误解。你的观点是有效的,我同意你的看法。我只是想确保我没有被误传,但我并不清楚自己的措辞。无论如何,没有难过的感觉,我真的很尊重你能够看到我的观点。干杯,伙计!
【解决方案3】:

这只是下面sn-p的命名约定 http://docs.angularjs.org/tutorial/step_05

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

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

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

【讨论】:

【解决方案4】:

美元 ($) 符号还可以防止元素在某些指令中被迭代(或解释)。 例如,以 $ 开头的属性不会在 ng-repeat 中使用,因为 an if clause in the for loop

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

有人发了关于这个话题here on angulars github page的问题


在方法shallowCopy 中,以$$ 开头的属性会因为if clause while iterating the properies 而被跳过:

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

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

      • 我想你误会了。 runtime 并不关心变量的名称。你可以称之为$$__$_$——它只是一个标识符,对解释器没有特殊意义。
      • 我添加了几句话来突出运行时和框架之间的区别;请善意改变您的投票。
      【解决方案7】:

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

      【讨论】:

      • 这是正确的答案。这是合乎逻辑和简单的。这些实际上是服务,所以最好记住 $ 'S' 是服务。很好的简单解释。
      • $scope 是服务吗?
      【解决方案8】:

      @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 的作者解释得更好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-05
        • 2015-08-29
        • 2013-05-28
        • 1970-01-01
        相关资源
        最近更新 更多