我知道这与承诺有关,但我很难理解如何实施承诺。
我的控制器:
angular.module('landingApp')
.controller('MainCtrl', function($http, $q){
var main = this;
main.favoritesIds = [];
$http.get('api/v1/planograms/get_favorites')
.success(function(data){
for(var i=0; i < data.planograms.length; i++)
main.favoritesIds.push(data.planograms[i].id);
});
main.isFavorite = function(planogram_id){
return main.favoriteIds.indexOf(planogram_id) > -1;
};
然后在我的模板中我使用isFavorite():
<div class="col-md-6" ng-repeat="planogram in main.planograms">
<i class="fa fa-star fa-2x favorite" ng-class="{'yellow' : main.isFavorite(planogram.id)}">
所以基本上我希望所有标有“最爱”的平面图的星形图标变为黄色。但是main.isFavorite()返回未定义的我猜测因为$ http.get方法尚未解决。所以我的问题是如何在这种情况下实施承诺?
答案 0 :(得分:2)
首先,由于isFavorite
函数中存在拼写错误,因此无法正常工作:它不是main.favoriteIds
,而是main.favoritesIds
。
其次,无论承诺如何,都应该有效。你是正确的,在返回$http
调用之前,main.favoritesIds
为空,但是当它被填充时,数组将被填充,而isFavorite
函数(由Angular监视)是重新评价。
虽然你的代码在拼写错误修复后会起作用,但它并不是最佳的。观看的功能在每个摘要周期调用,应该非常快,而isFavorite
执行isIndexOf
,其复杂度为O(n)。
创建一个对象,而不是创建favoritesIds
数组,这样就可以进行O(1)查找。或者,更好的是,用最喜欢的数据扩充planograms
数组。
例如,favoritesIds
作为对象:
$http.get('api/v1/planograms/get_favorites')
.success(function(data){
for(var i=0; i < data.planograms.length; i++) {
main.favoritesIds[data.planograms[i].id] = true;
}
});
main.isFavorite = function(planogram_id){
return main.favoritesIds[planogram_id];
};