2015-11-10 3 views
0

Я не понимаю, почему выход этой программы не

Global value is 4 

Child Instance of Function1 created :- 1 

Child Instance of Function2 created :- 2 

Child Instance of Function1 created :- 3 

Child Instance of Function2 created :- 4 

Plunker - http://plnkr.co/edit/HktvgxMM0g1WJG2oLjIN?p=preview

Спасибо за помощь.

ответ

-1

Вы можете понять это таким образом, что $ rootScope - это самая большая область видимости, и в нее входит вся другая область (то есть $ scope). Таким образом, вы должны передавать значение между областями, тогда вы должны использовать $ rootScope.

Примечание: function1 использует локальную переменную Counter, где область видимости находится внутри контроллера. То есть каждый контроллер имеет собственный объем. function2 использует глобальную переменную Counter, потому что глобальная переменная не определяет.

В вашем случае (помните, что угловая поддержка двухсторонняя привязка, поэтому всякий раз, когда изменение глобального значения изменяется во всех местах), контроллеры вызываются в следующей функции порядка1 -> function2 -> function1 -> function2.

Когда function1 получится вызвано в первый раз $rootScope.Counter нет, поэтому он инициализируется одним и назначает его локальной переменной «Счетчик».

so output look like 
Global value is 1 
Child Instance of Function1 created :- 1 

Child Instance of Function2 created :- 1 

Child Instance of Function1 created :- NA // local scope for this is not created 

Child Instance of Function2 created :- 1 

Теперь функция2 будет вызвана. Это увеличивает глобальную переменную Счетчик до 2 и использует его для отображения

so output look like 
Global value is 2 
Child Instance of Function1 created :- 1 

Child Instance of Function2 created :- 2 

Child Instance of Function1 created :- NA // local scope for this is not created 

Child Instance of Function2 created :- 2 

Теперь функция 1 снова будет вызвана. Это увеличивает глобальную переменную Counter до 3 и присваивает ей локальную переменную.

so output look like 
Global value is 3 
Child Instance of Function1 created :- 1 

Child Instance of Function2 created :- 3 

Child Instance of Function1 created :- 3 //Because rootScope already have counter variable with 2 

Child Instance of Function2 created :- 3 

и, наконец, function2 дозвонились снова, Это увеличение глобальной переменной счетчика 4, и использовать его для отображения

so output look like 
Global value is 4 
Child Instance of Function1 created :- 1 

Child Instance of Function2 created :- 4 

Child Instance of Function1 created :- 3 

Child Instance of Function2 created :- 4 
1

Причина в том, что ваш второй контроллер ссылается на $rootScope на вид, в то время как первый контроллер ссылается на локальный $scope на вид.

Поскольку первый контроллер имеет локальный набор областей, он будет тем, что когда-либо был установлен в это время. В вашем случае 1 & 3.

Ваш второй контроллер, однако, ссылается на одно и то же значение ($rootScope). Поэтому во время создания экземпляра каждый из вторых контроллеров выводит значение на консоль в это время. Однако в представлении будет отображаться только последнее значение $rootScope (которое равно 4).


Просто помните, что $rootScope одинаково для всего, что использует его. Поэтому, если два места добавляют 1 к значению rootScope, тогда в итоге будет добавлено 2.

Также, когда вы используете {{Counter}}, на ваш взгляд, это то, что происходит. Угловой ищет иерархию областей для первого найденного значения Counter. Для вашего второго контроллера он не может найти локальный $scope, который имеет значение Counter, поэтому он затем проверяет $rootScope, где находится эта ссылка.

+0

Что это значит? –

0

Scope является экземпляром controller

Everytime вы объявляете controller в виду он будет создавать scope для собственных.

В Function1 вы увеличиваете Counter в $rooscope, а также назначаете в области управления Counter.

$rootScope.Counter = (($rootScope.Counter || 0) + 1); 
$scope.Counter = $rootScope.Counter; 

И если переменная как родителя, так и дочернего объекта - это то же имя, всегда будет выполняться ребенок.

Именно поэтому в виду значение Counter будет областью для детей Counter.

В Function2 вы увеличиваете счетчик в rootScope но не использовать локальную область видимости, так Counter будет rootScope без каких-либо сомнений.

$rootScope.Counter = (($rootScope.Counter || 0) + 1); 

Так Simmulation будет

Function1 : 

rootScope : 1 
Scope : 1 // will print this 


Function2 

rootScope : 2 // will print this 



Function1 : 

rootScope : 3 
Scope : 3 // will print this 


Function2 

rootScope : 4 // will print this 

Что касается двух связывания, где вы используете rootScope «s Counter он будет печатать 4 в качестве текущего значения в Counter в rootScope составляет 4.

Если вы хотите получить желаемый ответ, вы должны присвоить значение счетчика дочернего Scope в Function2 как Function1

, как это

$rootScope.Counter = (($rootScope.Counter || 0) + 1); 
$scope.Counter = $rootScope.Counter; 
$scope.ControllerName = "Function2"; 

PLUNKR

0

Как уже было упомянуто в более ранних ответах $scope создается/вводится в новый контроллер во время его создания (Function1 и Function2 в вашем случае). Каждый $scope может быть большим или большим ... великим ребенком $rootScope, как вы можете узнать по $scope.$id по сравнению с $rootScope.$id.

Если вы хотите, чтобы более близкое поколение ребенка или ребенка было создано более детально, вы можете создать $ scope с помощью $scope = $rootScope.$new(), но это не очень практично. Если вы используете $rootScope.$new() для создания $scope, у вас гарантированно будет такое же значение Counter, как и у $rootScope, но при этом не так много преимуществ.

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