2015-02-22 1 views
0

я создал тест, расположенный на plunker по этому адресу: Full example on plunkerУгловой, Почему у дочернего контроллера есть такой же объем, что и у родителя?

Здесь контроллер ребенок, который работает:

child.directive('child', function(){ 
    return{ 
     restrict:'E', 
     templateUrl: 'child.html', 
     link: function(){}, 
     controller:['$scope', function($scope){ 
     this.inherited = $scope.test; 
     this.local = "child"; 
     }], 
     controllerAs:'child' 
    }; 
    }); 

Я ожидаю контроллер, расположенный в child.js быть ребенком контроллер контроллер в script.js. Это означало бы, что если я хочу получить доступ к переменной, добавленной в область родительского контроллера из дочернего контроллера, мне нужно будет получить к ней доступ с помощью $ scope. $ Parent. Может ли кто-нибудь объяснить, почему это та же область?

ответ

0

По умолчанию директивы не создать новую область. Таким образом, в вашем примере $ scope в директиве будет тем же значением, что и область, в которой содержится контроллер. Область не наследуется - они являются одинаковой областью.

Так что для этой разметки:

<div ng-controller="SomeController"> 
    <child></child> 
</div> 

сфера в SomeController будет точно такой же объект, как объем в вашей директиве. Если вы указали $ scope. $ Parent в директиве, вы действительно получите доступ к родительской области SomeController. Это эквивалентно

scope: false //default for directives 

Если добавить:

scope: true 

к вашему определению директивы, то директива будет создать новую область, которая образцово наследуется от родительской области. В этой ситуации,

<div ng-controller="SomeController"> 
    <child></child> 
</div> 

Теперь $ размах. $ Родитель в директиве будет $ объем SomeController. Кроме того, поскольку он прототипически наследуется, директива будет иметь доступ к методам и свойствам, определенным в $ scope. $ Parent, с оговорками и сложностями, которые возникают с прототипическим наследованием в javascript.

Если вы используете:.

scope: {} 

Теперь $ сфера $ Родитель в директиве по-прежнему будет $ объем SomeController, но новая сфера не будет образцово унаследовать от родителей, так что вы не будете иметь доступ к методам и свойствам, определенным в $ scope. $ parent.

0

Дочерняя область наследуется от родительской области, поэтому все, что вы определяете в родительском элементе, будет отображаться в области содержимого. Имейте в виду, что это новая область, поэтому изменения не будут влиять на родителя напрямую, не используя область $scope.$parent. Взгляните на этот вопрос и принятый ответ: AngularJS access parent scope from child controller

+0

За исключением того, что в директивах родительская область наследуется по умолчанию, поэтому вам не нужно использовать $ parent для доступа к этим значениям. –

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