2015-02-09 151 views
1

我知道这与Promise有关,但我很难理解如何实现它们。

我的控制器:

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()返回undefined我猜,因为$ http.get方法尚未解决。所以我的问题是如何在这种情况下实现承诺?

+0

尝试过(而不是成功() – Asik 2015-02-09 18:00:00

+0

同样的事情发生 – mikeglaz 2015-02-09 18:04:53

回答

2

首先,它不起作用,因为您在isFavorite函数中有一个错字:它不是main.favoriteIds,而是main.favoritesIds

其次,它应该工作,不管承诺。在返回$http调用之前,您说的没错,main.favoritesIds是空的,但是当它被填充时,数组将被填充,并且将重新评估(由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]; 
}; 
+0

哇,我很尴尬......这是这是问题的错字。 – mikeglaz 2015-02-09 18:12:03

+2

@mikeglaz,进一步阅读 - 还有更多问题 – 2015-02-09 18:12:30

+0

@NewDev,赶上! :) – Asik 2015-02-09 18:24:49