2017-02-16 24 views
0

下午好,

我一直在努力解決一個不熟悉的問題。但首先讓我解釋我想要達到的目標。

目的

我想要做的是,在每個視圖設置定時器,因此,如果互聯網連接速度很慢的定時器調用,用於顯示ionicPopup有問題的功能:「你喜歡刷新視圖?「結合刷新按鈕。點擊按鈕後,視圖將刷新。如果視圖在時間上加載(我已將該定時器設置爲10000毫秒),則將調用$ timeout.cancel操作並停止定時器。

如果這將是所有它現在工作正常。

問題

如果我通過我的主要網頁瀏覽迅速,它看起來像計時器不會停止,「刷新彈出」另一個頁面上彈出。只有當你高速點擊時纔會發生這種情況。它看起來像是彈出一些彈出在對方下面。我不知道可能是什麼問題,但我想如果您快速瀏覽頁面,$ timeout.cancel不會被調用。

代碼

服務

.factory('Timer', function ($ionicPopup, $state, $timeout) { 
    return { 
     start: start 
    }; 

    function start() { 
     return $timeout(showPopup, 10000); 
    } 

    function showPopup() { 
     $ionicPopup.show({ 
      title: 'Slow internetconnection', 
      template: 'Click refresh to try again.', 
      buttons: [ 
       { 
        text: 'Refresh', 
        onTap: function (e) { 
         $state.reload() 
        } 
       } 
      ] 
     }) 
    } 
}) 

控制器

.controller('HomeCtrl', function ($scope, Request, Timer, $timeout) { 
    var timer = Timer.start(); 

    Request.execute().finally(function() { 
     $timeout.cancel(timer); 
    }) 

    $scope.$on('$destroy', function() { 
     $timeout.cancel(timer); 
    }); 
}) 

我希望我的問題是可以理解的。

+0

你測試了'$超時嗎?取消(定時器)'調用實際上被稱爲?也許你的代碼永遠不會接到這些調用您可能想要查看Ionic View Events,而不是使用'$ destroy',如[here](http://ionicframework.com/docs/api/directive/ionView/)所列。 – Dexter

+0

我測試過了,但是我在其他地方發現了問題。它現在是固定的!:) – Giovanni

回答

3

這裏要注意的關鍵是:

如果我通過我的主要網頁瀏覽迅速,它看起來像計時器 沒有停止,「刷新彈出」另一個頁面上彈出。

當您瀏覽時,您的離子視圖被創建/銷燬,因此您將失去對對象的引用。

因此,在您使用計時器的控制器中,在離開該頁面之前必須使計時器無效。這是因爲計時器是關於JavaScript的setTimeoutsetInterval的包裝器,並且JavaScript具有方法級作用域,該方法級作用域將該方法作爲參數傳遞給setInterval,該作用域將在控制器被破壞時持有引用。因此,當您更改視圖時,雖然您的控制器實例可能會被刪除,但計時器不會。

在您的控制器中添加$ionicView.afterLeave回調。

$scope.$on("$ionicView.afterLeave", function(event, data){ 
    $timeout.cancel(timer); 
}); 

這將取消特定控制器的計時器,在該控制器的視圖被解散後。

相關問題