2015-04-09 3 views
1

Когда я добавляю $ broadcast в $ rootScope и перехватываю его другому контроллеру, он не отражает никакого значения для просмотра. Пример:

// on first ctrl. 
 
controller('firstCtrl', ['$scope','$location', '$rootScope', function($scope, $location, $rootScope) { 
 
    $scope.myFunc = function() { 
 
     $rootScope.$broadcast('someEvent'); 
 
     $location.path('/users'); 
 
    } 
 
}]) 
 

 

 
// On Users Page. 
 
.controller('usersCtrl', ['$scope','$rootScope', function($scope, $rootScope) { 
 
    $scope.dataFilter = {}; 
 
    $rootScope.$on('someEvent', function(event, b) { 
 
     $scope.callOnBroadcast(); 
 
    }); 
 
    
 
    // call this function on broadcast. 
 
    $scope.callOnBroadcast = function() { 
 
     $scope.dataFilter = { 
 
     types: [ 
 
      {key: 'tags',  val: 'Collections'}, 
 
      {key: 'prices', val: 'Price'}, 
 
      {key: 'ratings', val: 'Rating'}, 
 
      {key: 'designers',val: 'Designer'} 
 
     ], 
 
     data: {tags: [], prices: [], ratings: [], designers: []} 
 

 
     }; 
 

 
     $scope.$apply(); 
 

 

 
    }; 
 
}])
<h4 data-ng-repeat="ftr in dataFilter.types"> 
 
    {{ftr.val}} 
 
</h4>

Когда я использую MyFunc функцию firstCtrl, он будет перенаправлять меня на страницу пользователя, также транслировалась функции запуска. На странице пользователя, я использую $scope.callOnBroadcast(), когда широковещание включено, но оно отражает любые изменения на странице просмотра, даже я использую $scope.$apply(). Где я ошибаюсь?

+1

сделать '$ rootScope $ широковещательный ('someEvent');' если иерархия контроллер не there..Please добавить HTML чтобы увидеть, как иерархия вашего контроллера –

+0

не является иерархией контроллеров, поэтому я добавил $ broadcast в $ rootScope. – Rajeev

+0

О, извините, его копия ошибка пасты. Я уже использую $ broadcast в $ roootScope. – Rajeev

ответ

2

Ваш и контроллер не имеет какую-либо иерархии, поэтому вам нужно $ транслировать событие в $rootScope, а не объем,

Вашей проблемы вы вещание события перед регистрацией слушателя события. После этого вы делаете $location.path('/users'), которые загружают пользовательский шаблон с usersCtrl.

Я думаю, что вы должны сделать перенаправление 1-го, а затем транслировать событие в $rootScope с определенной timeout заказовМои сделать доступными usersCtrl

Code

// on first ctrl. 
controller('firstCtrl', ['$scope','$location', '$rootScope', '$timeout',function($scope, $location, $rootScope, $timeout) { 
    $scope.myFunc = function() { 
     $location.path('/users'); 
     $timeout(function(){ 
      //boardcast will available to every listener 
      $rootScope.$broadcast('someEvent'); 
     },1000); 
    } 
}]); 

Убедитесь, что другой слушатель код должен быть зарегистрирован до , передающего событие. (Ниже слушателя необходимо зарегистрировать передние радиовещание).

$scope.$on('someEvent', function(event, b) { 
    $scope.callOnBroadcast(); 
}); 

Для делает его более лучшее решение, вы могли бы использовать решимость $routeProvider

+0

Я использую этот код, но он не работает. – Rajeev

+0

Не могли бы вы подтвердить, что контроллер был загружен или нет до события трансляции –

+0

Да, контроллер загружается, и если я добавляю предупреждение в '$ scope.callOnBroadcast()', он отражает. – Rajeev

0

Вы можете вводить $ rootScope в контроллерах и вещания на этом уровне. Вы можете увидеть $ широковещательный принимая эффект здесь: http://plnkr.co/edit/ySrEU4accdgeY7iJhdZi?p=preview

app.controller('firstCtrl', ['$scope', '$rootScope','$location', function($scope, $rootScope, $location) { 
$scope.myFunc = function() { 
    $rootScope.$broadcast('someEvent'); 
    $location.path('/users'); 
}; 

}]) 


// On Users Page. 
.controller('usersCtrl', ['$scope', '$rootScope', function($scope, $rootScope) { 
$scope.dataFilter; 
$rootScope.$on('someEvent', function(event, b) { 
    $scope.callOnBroadcast(); 
    //$scope.dataFilter = 'test'; 
}); 

// call this function on broadcast. 
$scope.callOnBroadcast = function() { 
    $scope.dataFilter = { 
    types: [ 
     {key: 'tags',  val: 'Collections'}, 
     {key: 'prices', val: 'Price'}, 
     {key: 'ratings', val: 'Rating'}, 
     {key: 'designers',val: 'Designer'} 
    ], 
    data: {tags: [], prices: [], ratings: [], designers: []} 

    }; 

    //$scope.$apply(); <- I don't think is necessary 


}; 

}])

+0

Код работает, если я использую $ rootScope.dataFilter вместо $ scope.dataFilter. Я не знаю, почему это происходит. Поскольку view имеет «usersCtrl», поэтому их не нужно добавлять $ rootScope. – Rajeev

+0

Просто для подтверждения - пользовательский скрипт уже создан при вызове функции, правильно? – tpie

+0

вправо, ctrl, созданное сначала, а затем вызов функции – Rajeev

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