我正在編寫我的第一個AngularJS應用程序。着陸頁有兩個鏈接#/view1
和#/view2
。每個鏈接都會呼叫單個控制器分別渲染<div ng-view></div>
。當控制器變爲背景(或無效)時需要停止正在進行的操作
view1Ctrl
將定期從服務器獲取數據。我可以每X秒在控制檯中看到ajax調用。現在我點擊#/view2
,應用程序應該使用view2Ctrl
。我預計view1Ctrl
不應再從服務器獲取數據。但實際上它確實如此。
.controller('View1Ctrl', function($scope, $http) {
$scope.update = function() {
$http.get('/api/foo')
.success(function(data) { /* got new data */ })
.error(function(data) { /* error occurred */ })
.finally(function() {
setTimeout($scope.update, 1000);
});
}
$scope.update();
});
我有兩個問題:
- 是控制器始終活躍在初始化操作之後。
- 停止任何後臺控制器的最佳做法是什麼?我的想法是檢查
$location.path()
。
更新1:
控制器實際上是破壞。但操作update
會自行調用它,所以操作將被稱爲無窮無盡。
我目前的解決方法將檢查當前位置是否已更改。所以它工作。我正在尋找更優雅的方式,如果它存在。
.controller('View1Ctrl', function($scope, $http) {
$scope.update = function(path) {
$http.get('/api/foo')
.success(function(data) { /* got new data */ })
.error(function(data) { /* error occurred */ })
.finally(function() {
if (path === $location.path()) {
setTimeout($scope.update, 1000, path);
}
});
}
$scope.update($location.path());
});
更新2:
更好的方法是看破壞和取消正在進行的超時承諾。由於@pankajparkar
.controller('View1Ctrl', function($scope, $http, $timeout) {
var timeoutPromise;
$scope.$on("$destroy", function(){
$timeout.cancel(timeoutPromise);
});
$scope.update = function() {
$http.get('/api/foo')
.success(function(data) { /* got new data */ })
.error(function(data) { /* error occurred */ })
.finally(function() {
timeoutPromise = $timeout($scope.update, 1000);
});
}
$scope.update();
});
[好閱讀](http://stackoverflow.com/questions/16094940/what-is-the-lifecycle-of-an-angularjs-controller) – Harben 2015-02-23 18:13:49
http://stackoverflow.com/questions/28657287/通過價值在角js/28657470#28657470看看它吧 – 2015-02-23 18:15:37