2016-11-07 99 views
0

我M的定義使用的UI路由器我的應用程序狀態:控制器生命週期角度

$stateProvider 
    .state('app', { 
    abstract: true, 
    views: { 
     '[email protected]': { 
     templateUrl: 'app/navbar.html', 
     controller: 'NavbarController', 
     controllerAs: 'vm' 
     }, 
     '[email protected]': { 
     template: '<div ui-view></div>' 
     } 
    } 
    }) 
    .state('child1', { 
    url: '/child1', 
    parent: 'app', 
    templateUrl: 'app/child1.html', 
    controller: function($timeout) { 
     $timeout(function() { 
     alert('from child_1'); 
     }, 15000) 
    }, 
    controllerAs: 'vm' 
    }) 
    .state('child2', { 
    url: '/child2', 
    parent: 'app', 
    templateUrl: 'app/child2.html', 
    controller: 'ctrl_2', 
    controllerAs: 'vm' 
    }) 

當我去從/child1/child2快速(前15000毫秒),我仍然看到了警報在child1控制器中定義,這是一個正常的行爲?

+0

你是什麼意思? –

+0

@GauravSrivastava我的意思是在5秒之前,這是'child1'控制器中'$ timeout'函數的第2個參數。 – Mahmoud

+0

超時一定會奏效。雖然角度服務在那裏,但它是一個窗口事件。你需要清除超時範圍銷燬事件 – murli2308

回答

2

這是正常行爲嗎?

是的,這是正常的行爲。創建並賦予另一個函數(例如$timeout服務)的函數引用將一直持續,只要其他函數保留該引用即可。對於$timeout服務,它將在超時期間(在本例中爲15秒)內保留該參考。

另外,如果子函數使用父函數的局部變量,則這些局部變量將在子函數的生命期中保留。這個過程被稱爲「創建關閉」。

欲瞭解更多信息,請參閱MDN JavaScript Reference - Closures

需要被告知取消暫停和刪除引用的$timeout服務或將持續超過控制器的使用壽命。

controller: function($timeout, $scope) { 
    var promise = $timeout(function() { 
    alert('from child_1'); 
    }, 15000); 
    $scope.$on("$destroy", function() { 
    promise.cancel(); 
    }); 
}, 

在上面的例子中,服務$timeout附加被叫cancel到它返回承諾函數。客戶端代碼可以調用該函數來通知$timeout服務中止超時並釋放對函數的引用。

ui-routerchild1狀態切換到另一個狀態時,它破壞了控制器的範圍。控制器應該監聽$destroy事件並取消超時。