【问题标题】:Why Injecting Scope and RootScope to Controllers in angularjs为什么在 angularjs 中将 Scope 和 RootScope 注入控制器
【发布时间】:2015-05-14 14:23:03
【问题描述】:

在Angular JS控制器中,为什么我必须同时注入作用域和根作用域,控制器不能将其作用域作为根作用域的子级,并且默认注入,就像在视图中一样,我总是可以将作用域和根作用域的属性都引用为裸变量.......为什么这也不适用于控制器,甚至也适用于服务?

【问题讨论】:

  • 一个原因是它使单元测试既容易又可能

标签: angularjs model-view-controller


【解决方案1】:

是的,您对$rootScope 的看法是正确的。根据 Angular Js 文档

Every application has a single root scope. All other scopes are descendant scopes of the root scope. Scopes provide separation between the model and the view, via a mechanism for watching the model for changes. They also provide an event emission/broadcast and subscription facility.

但是注入的原因是,这就是只有 Angular 的工作原理,Angular 的注入器功能会查找所有注入的依赖项并创建对象的引用。也根据文档:

A root scope can be retrieved using the $rootScope key from the $injector.

【讨论】:

    【解决方案2】:

    其实,更多的用户对为什么两者都用在控制器中感到困惑

    $scope 用于控制器和视图之间的通信。 $scope 将视图(DOM 元素)绑定到视图模型

    但是rootscope,应用程序中只有一个rootscope,它在应用程序的所有组件之间共享。 $rootscope 一个全局变量。所有其他 $scopes 都是 $rootScope.

    举例

    有两个控制器都有作用域

     var app = angular.module('myApp', []);
     
     app.controller('Ctrl1', function ($scope, $rootScope) {
     $scope.msg = 'World';
     $rootScope.name = 'AngularJS';
     });
     
     app.controller('Ctrl2', function ($scope, $rootScope) {
     $scope.msg = 'Dot Net Tricks';
     $scope.myName = $rootScope.name;
     });
    

    rootscope 仅适用于所有控制器,但范围没有从另一个控制器获取

    注意

    当您将 ng-model 与 $rootScope 对象一起使用时,AngularJS 会更新 那些在控制器的特定 $scope 下但不在 全局级别 $rootScope。为每个控制器创建一个私有 $scope 将其绑定到视图。

    【讨论】:

    • 应用程序中会有两个$rootScope..如果在同一页面上引导了两个应用程序..
    • 它应该是全局使用注入应该是你得到那个
    • 你真的需要去阅读文档请看看这个 plunkr 告诉我有多少根范围plnkr.co/edit/rre9RD0tUbEcb0ty3bdw?p=preview
    • 我很感激,但我实际上问,为什么在这段代码中我仍然需要将控制器的作用域注入到自身中......更有趣的是你注入了它的父级。
    猜你喜欢
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 2014-03-02
    相关资源
    最近更新 更多