我對AngularJS非常陌生,並且一直與KnockoutJS一起工作了很長時間,因爲我仍然沒有充分理解Angular可以跟蹤並且無法跟蹤更改。AngularJS:當底層數據發生變化時,過濾數據不會更新
我正在構建一個應用程序,該應用程序將有一組底層數據,最初我將輪詢和更新,但稍後將改進爲從服務器推送。根據這些數據,應用中的所有數據都將進行轉換或過濾。所以我有一個服務來獲取數據,並同時獲取數據的常用過濾的版本,像這樣:
.factory('Scores', function ($resource, Utils, $q, $interval, $filter) {
var scoresResource = $resource('http://localhost:8000/scores'),
scoresData = [];
$interval(function() {
scoresResource.query(function (newScores) {
scoresData.length = 0;
angular.forEach(newScores, function (dataEntry) {
scoresData.push(dataEntry);
});
})
}, Utils.TIMES.SHORT);
return {
getAll: function() {
var deferred = $q.defer();
if (scoresData.length > 0) {
deferred.resolve(scoresData);
} else {
scoresResource.query(function (allScores) {
scoresData.length = 0;
angular.forEach(allScores, function (dataEntry) {
scoresData.push(dataEntry);
});
deferred.resolve(scoresData);
});
}
return deferred.promise;
},
getByLeagueName: function(leagueName) {
return this.getAll().then(function (allScores) {
return $filter('filter')(allScores, function (score) {
return score.League === leagueName;
})
})
}
}
});
而我只是控制器取過濾後的數據,並將其添加到的範圍。
.controller('LivescoresCtrl', function ($scope, $stateParams, Leagues, Scores, $interval, Utils) {
Scores.getByLeagueName($stateParams.leagueName).then(function (scores) {
$scope.scores = scores;
});
})
但是,當基礎數據更新時,似乎過濾的數據不會自動更新。我想避免在視圖中使用過濾器,因爲有時我需要以難以實現的方式將數據組合在一起。
所以我想我的問題是爲什麼這不更新時,主要數據更新,這是一個有效的方法在一個角度的世界。我可以在後端查找所有數據的變體,但由於這是一款移動應用程序,並且在任何時候都需要應用程序中的所有數據,所以我不想僅僅爲了組合或過濾數據而提出額外請求。
感謝,
感謝您的迴應,我擔心可能是這樣。所以,由於承諾只解決一次,從承諾返回的數組不是原來的更新數據相同的數組,然後角無法跟蹤任何更改。 我真的不希望把這個過濾/發現在控制器中,因爲它會很常見,然後將不得不重複很多。有沒有什麼角度可以與ko.computed相媲美,只要它的任何依賴關係發生變化就會更新?或者,也許更好的方式來構建一個應用程序? – 2014-11-02 12:22:25
我已經給我的答案添加了一些註釋。 – yerforkferchips 2014-11-02 17:32:58