2015-07-31 3 views
0

я написал ниже кодДоступ нг-модель данные за пределами контроллера

<span ng-controller="calanderCtrl"> 
<input type="text" ng-model="onDate"> 
</span> 
<pre>user.name = <span ng-bind="onDate"></span></pre> 

Я знаю его пределы нг-контроллер, так что я не в состоянии связать данные, но мое приложение требует контроллера calanderCtrl , Я хочу поместить это значение в область видимости, чтобы я мог использовать его и внутри других контроллеров. Как мне это сделать?

+0

использовать переменную $ rootscope – Sajeetharan

+0

@Sajeetharan - Можете ли вы показать код образца – Hacker

ответ

3

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

function Ctrl($scope) { 
    $scope.onDate = "12/01/2015"; 

    $scope.$watch('onDate', function(newValue, oldValue) { 
    $scope.$emit('onDateChanged', newValue); 
    }); 
} 

function Ctrl2($scope, $rootScope) { 
    $scope.onDate = ""; 

    $rootScope.$on('onDateChanged', function(event, value) { 
    $scope.onDate = value; 
    }); 
} 

Ваш контроллер будет вызван при загрузке шаблона.

<span ng-controller="Ctrl"> 
<input type="text" ng-model="onDate"> 
</span> 
<pre>user.name = <span ng-controller="Ctrl2" ng-bind="onDate"></span></pre> 

Теперь, как это работает:

Угловые не разделяет области. Каждый контроллер имеет свою собственную раздельную область. Итак, чтобы обновить наши детские области, нам нужно как-то бросить событие, на которое наши дети будут подписаны. Это можно сделать двумя способами.

$scope.$emit или $rootScope.$broadcast

Разница между этими двумя тонкими.

$ scope. $ Emit wil отправить событие вверх по цепочке. поэтому, например, рассмотрим эту иерархию областей.

rootscope 
    scope1 ---> subscribes to the emit $scope.$on 
     scope2 ---> performs a $scope.$emit 
     scope3 ---> subscribes to the emit $scope.$on 

только scope1 поймает событие. так как $ scope. $ emit поднимается вверх по цепочке. Это способ обновления только определенных областей. хотя в основном это делается.

rootscope 
     scope1 ---> subscribes to the emit $rootScope.$on 
      scope2 ---> performs a $scope.$emit 
      scope3 ---> subscribes to the emit $rootScope.$on 

мы вводим $ rootScope в контроллере обл1 и scope3 и подписаться на Emit на rootscope. Поскольку корнеплод является наивысшим масштабом, он всегда будет ловить $ emit из области2. Это способ отправить событие только конкретным контроллерам, которые подписываются на корнеплодах.

, наконец, мы можем также сделать это:

rootscope 
      scope1 ---> subscribes to the emit $scope.$on 
       scope2 ---> performs a $rootScope.$broadcast 
       scope3 ---> subscribes to the emit $scope.$on 

теперь мы кричали на rootscope и вместо того, чтобы двигаться вверх, как излучать, широковещательный работает вниз по цепочке. Это эквивалент крика в комнате, и все, у кого нет защитников уха, услышат его. в сущности, каждый, кто подписывается на свою локальную область, на событие, которое транслирует, отправляет

+0

Когда вызывается Ctrl1 и Ctrl2? – Hacker

+0

@Hacker Я обновил свой ответ –

+0

$ Ctrl2 не вызывается – Hacker

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