0

UIとしてAngular Kendoを使用したAngularJSアプリがあります。
サービスの 1 つから、コントローラーにブロードキャストを送信しています。

以下のようにサービスからブロードキャストを送信しています。

angular.module('MyAppModule')
.service('MyService', ['$rootScope',function($rootScope)
{    
    this.MESSAGE = "broadcast_msg";

    function sendBroadcast(message, data)
    {
        console.log("I get this log");

        $rootScope.$broadcast(message, data);

        console.log("I don't get this log");
    }

    function onSomeEvent(data)
    {
        sendBroadcast(MESSAGE, data)
    }

}]);

そして私のコントローラーで:

angular.module('MyAppModule')
.controller('MyViewCtrl', ['$scope', 'MyService', function($scope, MyService)
{
    function init()
    {
        $scope.$on(MyService.MESSAGE, function(event, data) 
        {
            if( data.state == "some_state")
            {
                process()
            }
        });
    }

    function process()
    {
        // Destroy and remove current screen 
        $("#MyView").data("kendoMobileView").destroy(); // KendoMobileView is provide by Kendo 
        $("#MyView").remove(); // MyView - is that ID of kendo mobile view 
    }

}]);

コメントdestroyしてremove電話すると、すべて正常に機能します。
しかし、追加する$rootScope.$broadcatsとサービスに戻りません。

画面と関連する状態をクリアする必要がremoveあります。destroy

この問題を解決するにはどうすればよいですか?

アップデート

以下のように、コントローラーからブロードキャストリスナーの登録を解除しています。

// While registering listener   
var deregisterMessage = $scope.$on(MyService.MESSAGE, function(event, data) 
{
});

// At the time of removing screen 
if( deregisterMessage != null )
{
   deregisterMessage();
   deregisterMessage = null;
}
4

1 に答える 1

0

コントローラーから使用しない$rootScope.$onでください。コントローラーが破棄された後でも、イベント リスナーがまだ存在し、メモリ リークが発生するためです。

リッスンまたはブロードキャストする必要があるイベントごとにサービスを作成することをお勧めします。

于 2016-10-18T06:09:46.170 に答える