等待 $http.get 调用完成
waiting for $http.get call to complete
我知道这与承诺有关,但我很难理解如何实现它们。
我的控制器:
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)}">
所以基本上我希望所有标记为 'favorite' 的货架图的星形图标都变成黄色。但是 main.isFavorite() returns undefined 我猜是因为 $http.get 方法还没有解析。所以我的问题是在这种情况下我将如何实现承诺?
首先,它不起作用,因为你在 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];
};
我知道这与承诺有关,但我很难理解如何实现它们。
我的控制器:
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)}">
所以基本上我希望所有标记为 'favorite' 的货架图的星形图标都变成黄色。但是 main.isFavorite() returns undefined 我猜是因为 $http.get 方法还没有解析。所以我的问题是在这种情况下我将如何实现承诺?
首先,它不起作用,因为你在 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];
};