2015-03-02 2 views
1

Я читал this article о наследовании области видимости в AngularJS и смущен этот код, например:Почему это приводит к наследованию?

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, не объяснит этого, посколькуне установлен на прототипе и, кроме того, был установлен после создания области с дочерним объектом $scope.

Единственное объяснение заключается в том, что области в Угловом глубоко модифицированы так, что все переменные, установленные на них, передаются в существующие дочерние области. Если я не пропущу что-то, более чем возможно.

Может ли это объяснить это?

Edit: Мое нынешнее понимание, что $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 объекта. Если вы добавите свойство (например, someProperty) на $rootScope и попытаетесь получить к нему доступ с помощью $scope.someProperty, тогда будет проверено, что это свойство существует на $scope (т.е. текущая область). Если это свойство не существует, то оно будет проверяться на более высоком уровне в цепочке областей видимости (т. Е. $rootScope).

0

В AngularJs, насколько я знаю, осциллографы наследуются от родительской области, всех переменных, но если у вас родственного объем а затем эти значения не будут наследоваться. Трансляция выполняется для событий.

Итак, Angular работает так, как должно быть. Если вы установили некоторую переменную на $ rootScope, которая будет доступна во всем приложении.

1

ng-controller создаст new Scope.

прототип этого прицела установлен в parent Scope (i.e, $rootScope)

И это поведение JavaScript по умолчанию для поиска в цепочке прототипов, если свойство, которое мы ищем, не найдено в объекте.

Scope inheritance

Смежные вопросы