【问题标题】:$scope and $rootscope variables' life term$scope 和 $rootscope 变量的生命周期
【发布时间】:2017-04-09 09:28:24
【问题描述】:

在 angularjs 中,我看到了很多 $scope 和 $rootscope 的用法。 我喜欢了解附加到 $scope 和 $rootscope 的变量的生命周期。 说,我有 a.js/a.html 和 e.js/e.html。

a.js 有 $scope 附加变量,比如 $scope.b、$scope.c、$scope.d 用于 a.html。 如果我用 e.js 和 e.html 加载另一个页面。那些 $scope.b、$scope.c、$scope.d 仍然有生命,或者它们已被删除。如果我在 e.js 中再次有 $scope.b、$scope.c、$scope.d,会出现什么问题? 我只想强调这些附加变量的生命周期。

【问题讨论】:

标签: javascript angularjs


【解决方案1】:
  1. $rootScope - 通常在您的主 app.js 文件中配置,您可以在其中定义 Angular 主模块和主配置。即使没有配置,也可以随时注入。
  2. $scope - 当前控制器(页面)中的当前范围。

  1. 只要您不刷新页面,$rootScope 变量就会存在。这意味着它们存在于您的 SPA 的所有转换中。
  2. $scope 变量仅存在于当前范围内(同样,只要您不刷新页面),一旦您转换到不同的控制器/页面,它们就会被释放。

【讨论】:

  • #1 不准确...$rootScope 在内部定义并且始终存在(在页面生命周期内),是否要注入它来访问它取决于您
  • @charlietfl,感谢您的澄清 - 编辑了我的答案
【解决方案2】:

$rootScope 与整个页面一样长

只要使用它的控制器或指令不再活动,$scope 实例就会被销毁

在浏览器的整个页面加载之间没有持久性的 javascript

【讨论】:

    【解决方案3】:

    $rootScope 是全局的,而 $scope 是本地的。当控制器被分配给一个页面时,$scope 变量可以在这里使用,因为它绑定到这个控制器。但是,当我们想将其值共享给其他控制器或服务时,则使用 $rootScope(**有其他方式共享值,但在这种情况下,我们希望使用 $rootScope)。

    AngularJS Scope Life-Cycle

    分配有$scope 的属性不能在定义它的控制器之外使用,而分配有$rootScope 的属性可以在任何地方使用。

    这意味着当您希望变量可以在单个变量中使用以在多个控制器(整个应用程序)中使用时,您可以使用 $rootscope

    $rootScope存在,但可以作恶

    Angular 中的作用域 形成一个层次结构,原型继承自顶部的根范围 树的。通常这可以忽略,因为大多数视图都有 控制器,因此是它们自己的范围。

    偶尔 您想让某些数据对整体全局化 应用程序。对于这些,您可以注入 $rootScope 并在其上设置值,例如 任何其他范围。由于范围从根范围继承,这些 值将可用于附加到指令的表达式 就像 ng-show 一样,就像您本地 $scope 上的值一样。

    当然, 全球状态很糟糕,你应该像你一样谨慎使用$rootScope 将(希望)与任何语言的全局变量一起使用。在 特别是,不要将其用于代码,仅用于数据。如果你想把 $rootScope 上的一个函数,最好把它放在一个 可以在需要的地方注入服务,并且更容易 测试。

    相反,不要创建仅用于 生活就是存储和返回数据。

    — AngularJS Docs Miscellaneous - FAQ

    【讨论】:

    • 当您想要可以在整个应用程序中使用的变量时更适合使用服务,而不是 $rootScope。你的大胆声明是一种糟糕的做法
    • 我只是更喜欢 $rootscope 作为单个变量在多个控制器中使用,否则我也使用服务。
    • prefer 和 best practice 是不一样的......正如你在黄色块引用中指出的那样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 2015-05-03
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 2012-05-19
    相关资源
    最近更新 更多