2015-03-02 96 views
1

我在AngularJS的范围继承阅读this article,并通过这个代码示例困惑:为什么会导致继承?

angular.module("Demo", []) 
    .controller("ChildCtrl", function($rootScope, $scope) { 
    $rootScope.rootyThing = "I am groot"; 
    console.log($scope.rootyThing); // "I am groot" 
    console.log(Object.getPrototypeOf($scope)); // Scope 
}); 

我不明白为什么$scope.rootyThing设置,而不是undefined

该文章的解释看起来不完整。从$rootScope的子范围“原型继承”的事实不能解释这一点,因为rootyThing没有设置在原型上,而且在创建子范围$scope后设置。

唯一的解释是如果Angular中的作用域被深度修改,使得它们上设置的所有变量都被广播到现有的子作用域。除非我错过了一些东西,超过可能。

任何人都可以解释这一点吗?

编辑:我现在的理解是,$rootScope其实Scope功能本身,而不是一个实例Scope,所有$scope情况下,以此为根原型,所以当变量的设置功能Scope然后他们自然可以访问各种$scope实例。

这是准确的吗?

回答

0

它被设置为原型,尝试CONSOLE.LOG

$scope.__proto__.rootyThing 

,你应该看到它在那里。

此外,对象是通过在javascript参考所以它不事关时$范围设定 例如

//say this is your rootScope 
objRoot = { 
    obj: { 
     test: 'hello' 
    } 
} 

//Now lets create a scope 
var temp = objRoot.obj 

//Update rootScope 
objRoot.obj.test = "changed" 

//log your temp 
console.log(temp.test); //changed 
1

所有作用域上$rootScope对象添加。如果您在$rootScope上添加了一个属性(例如someProperty),并且您尝试使用$scope.someProperty访问该属性,则会检查该属性是否存在于$scope(即当前范围)中。如果该属性不存在,则将在范围链中的较高级别上进行检查(即$rootScope)。

0

在AngularJs,据我所知,范围是从父作用域继承,所有的变量,但如果u有一个同胞范围那么这些值不会被继承。广播是为事件完成的。

所以,Angular的工作原理是一样的。如果你已经在$ rootScope上设置了一些可以在整个App中访问的变量。

1

ng-controller将创建一个new Scope

这个示波器的原型被设置为parent Scope(即,e,$rootScope在这种情况下)

而这是默认的JavaScript行为,看在原型链如果我们正在寻找的属性没有在对象中找到。

Scope inheritance