$ scope是AngularJS中的真实服务吗?

时间:2014-05-06 02:14:56

标签: angularjs angularjs-scope

$ scope是AngularJS中的服务还是$ rootScope的实例?

var $injector = angular.element(document).injector();
$injector.get('$rootScope'); //it will return $rootScope  
$injector.get('$scope');  //it will return undefined  

所以我怀疑$ scope不是真正的'服务。

3 个答案:

答案 0 :(得分:12)

$scope既不是服务也不是$rootScope的实例。它是Scope的实例(它是Angular代码中的私有构造函数)。实际上,$rootScope服务提供商会返回Scope的实例。

让我们从头开始:

  1. Angular有一个私有(例如,不能直接从外部访问,例如你)构造函数,名为Scope

  2. Angular可以使用
  3. Scope来创建新的范围对象。 (实际上,所有范围,包括隔离范围和rootScope本身,都是使用new Scope()在内部创建的。)

  4. 每个范围对象都有一个$new()方法,该方法创建一个新范围对象,该对象原型继承自调用$new()方法的范围。

  5. 只要加载了Angular,它就需要" $rootScope服务,它创建rootScope:一个普通的旧Scope对象(没有父作用域)。由于服务是Angular中的单例,因此只要注入了$rootScope服务,就会提供相同的rootScope对象。

  6. 每当需要新的范围时(例如,对于定义新范围(正常或隔离)的指令,对于控制器等),将创建一个新的Scope对象并使用前面提到的{{1已存在的Scope对象的方法(即rootScope或rootScope的后代)。

  7. 那么,注入控制器的$new()依赖是什么? 它是一个Scope对象,由Angular创建,调用封闭范围的$scope方法并传递给控制器​​构造函数。 (因此,它不是服务,而是Angular为我们创建的Scope实例。)


  8. 那就是说,你的代码可以像这样改变:

    $new()

答案 1 :(得分:0)

Angular中只有一个真正的范围,即$ rootScope。每个其他范围都继承自它。 $ scope是Angular在mvvm世界中创建模型的机制。

答案 2 :(得分:0)

$ scope继承自$ rootScope(prototype),但它们始终在视图的上下文中定义。指令数创建新范围(ng-include,ng-if和其他),实际上ng-controller也会创建一个新范围,然后链接到视图。这里重要的是范围没有独立存在,并且总是在视图的连接中引用。