使用angularjs 1.2.21
當我不使用與$ HTTP緩存,顯然GET和異步響應之間的消化週期,因爲視覺元素在更改爲在視圖中插值的變量後在我的頁面中正確更新。 但是,當我將緩存設置爲true,並且數據來自緩存時,我的視圖停止更新,這意味着沒有摘要發生。
angularjs doc指出即使數據來自緩存,響應也是異步的。但它沒有提到消化週期。
請注意,即使響應是從緩存中提供的,數據的傳遞也是與實際請求相同的異步方式。
要解決這個問題,我需要把$ http調用放在$ timeout(func,0)中。
因此,在您看來,它是一個錯誤還是設計?
更新:@PSL I forked your plunk向您展示如何重現它。運行。您會看到第一次按下按鈕時顯示「正在加載」消息,則不會再出現。刪除緩存,它會每次出現。基本上,我試圖在獲取呼叫期間改變視圖,並在完成時恢復視圖。
<!DOCTYPE html>
<html ng-app="plunker">
<head>
<meta charset="utf-8" />
<title>AngularJS Plunker</title>
<script>document.write('<base href="' + document.location + '" />');</script>
<link rel="stylesheet" href="style.css" />
<script data-require="[email protected]" src="https://code.angularjs.org/1.2.21/angular.js" data-semver="1.2.22"></script>
<script src="app.js"></script>
</head>
<body ng-controller="MainCtrl">
<p ng-show="load">Load in progress</p>
<p>{{i}}</p>
<button ng-click="refresh()">Refresh</button>
</body>
</html>
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope, $http) {
$scope.name = 'World';
$scope.i=0;
$scope.load = false;
$scope.refresh = function(){
$scope.load = true;
$http.get('test.json', {cache:true}).success(function(resp){
$scope.i++;
$scope.name = resp;
$scope.load = false;
});
}
});
更新2:我不認爲我能在這裏重現,因爲我實際的代碼更復雜。實際上,修改load變量被另一個指令(綁定到它)捕獲,它將重置第三方jquery模塊。當使用緩存時,jquery模塊並不總是能夠正確復位,這往往會表明得到的響應太快以至於綁定無法到達觀看它的模塊...
正常工作對我.. http://plnkr.co/edit/lRoHIJ?p=preview你的問題可能是在其他地方。你可以複製它嗎? – PSL 2014-09-18 18:49:30
@PSL謝謝。更新我的問題向你展示。 – 2014-09-18 19:38:01
很酷。你能粘貼分叉的網址嗎? – PSL 2014-09-18 19:41:34