4

この PlunkerDemo では、親コントローラーから子コントローラーにイベントをブロードキャストしようとしています。ただし、親コントローラーで直接実行しても機能しません。ハンドラーはイベントを登録しません。ただし、ng-clickまたはsetTimeoutに基づいて実行すると、機能します。スコープのライフサイクルによるものですか?

http://beta.plnkr.co/edit/ZU0XNK?p=preview

受け入れられた回答のコメントを参照してください。彼らは私の問題を説明します。

4

2 に答える 2

17

angular スコープへの変更は、angular フレームワーク内で行う必要があります。フレームワーク外で変更を行う必要がある場合は、.$apply関数を使用する必要があります。

$apply() は、angular フレームワークの外部から angular で式を実行するために使用されます。

あなたのケースでは、コールバックが角度フレームワークの外部で呼び出される$broadcast withinをトリガーしています。setTimeout

したがって、角度によって提供される$timeoutサービスを使用するか、 .$apply関数を使用するという 2 つの解決策があります。

関数を使用することを好み$timeoutます。

var ParentCtrl = function($scope, $rootScope, $timeout){

    $scope.broadcast = function(){
        $rootScope.$broadcast('Sup', 'Here is a parameter');
    };

    $timeout(function(){
        $scope.$broadcast('Sup');
    }, 1000);

    //this one does not work! Most likely due to scope life cycle
    $scope.$broadcast('Sup');

    $scope.$on('SupAgain', function(){
        console.log('SupAgain got handled!');
    });

};

デモ:フィドル

使用する$apply

setTimeout(function(){
    $scope.$apply(function(){
        $scope.$broadcast('Sup');
    });
}, 1000);
于 2013-03-28T07:08:24.870 に答える