1

$rootScope に $broadcast を追加し、それを他のコントローラーにキャッチすると、表示する値が反映されません。例:

// 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()。どこが間違っていますか?

4

3 に答える 3

2

両方のコントローラーに階層がないため$rootScope、スコープではなくイベントを $broadcast する必要があります。

あなたの問題は、リスナーイベントを登録する前にイベントをブロードキャストしていることです。その後$location.path('/users')、 でユーザー テンプレートをロードしますusersCtrl

最初にリダイレクトを実行してから$rootScope、特定のイベントをブロードキャストしtimeoutて、usersCtrl

コード

// 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

于 2015-04-09T05:47:17.560 に答える
0

この「AngularJS で Scope.$broadcast() が分離スコープと対話する方法」を ご覧ください http://www.bennadel.com/blog/2725-how-scope-broadcast-interacts-with-isolate-scopes-in- angularjs.htm

それはあなたに役立つでしょう。

于 2015-04-09T05:27:53.840 に答える