2013-07-29 118 views
0

我正在使用AngularJS,我無法正確綁定需要時間加載的模型。我有這個服務稱爲ListService:角度js模型不綁定

angular.module('3pix').factory('ListService', ['$q', '$timeout', 'underscore', 'Item', 'ItemResource', 
    function ($q, $timeout, _, Item, ItemResource) { 
     var List = function() { 
     }; 
     _.extend(List.prototype, { 
      _addItem: function(item) { 
       this.items || (this.items = []); 
       this.items.push(item); 
      }, 
      loadItems: function() { 
       var scope = this; 
       var deferred = $q.defer(); 
       ItemResource.get_items({id: 39}, function(itemsData) { 
        itemsData.forEach(function(itemData) { 
         scope._addItem(new Item(itemData)); 
        }); 
        deferred.resolve(scope.items); 
       }); 
       return deferred.promise; 
      } 
     }); 

     return List; 
    }]); 

我真正ListService比這複雜得多,但我只複製了相關部分,所以我可以問我的問題清楚。
稱爲ListController而且我的控制器使用會從路由器一個'清單「決心」選項:

angular.module('3pix').controller('ListController', ['$scope', 'jquery', 'list', 
    function ($scope, $, list) { 
     $scope.list = list; //<-------- Here I got the list, I get it fine from the router 
     list.loadItems(); //<------- Here I load the list's items 
}]); 

在我看來,我有:

<div class="item-wrapper" 
    ng-repeat="item in list.items"> 
    {{item}} 
</div> 

我的問題是後項加載到控制器中,視圖不會顯示這些項目並且不會畫任何東西。我試圖將loadItems的成功方法封裝在$ timeout和$ rootScope。$ apply中,但它沒有幫助。任何想法如何解決它?

UPDATE
我跟着@Chandermani的建議,我在我的控制器那樣:

list.loadItems().then(function() { 
    $scope.items = list.items; 
}); 

的項目被裝載在視圖中,不過,有時候,當我使用更新list.items _addItem()方法,什麼也沒有發生,視圖不顯示新項目。我試着用$超時包裹_addItem()如下,但它並沒有幫助或者:

_addItem: function(item) { 
     $timeout(function() { 
      this.items || (this.items = []); 
      this.items.push(item); 
     }); 
    } 
+0

試試這個,因爲你正在返回的承諾哪裏是你那麼控制器聲明? –

+0

@Ajaybeniwal:控制器中的聲明應該是什麼? List.items是變化,它不應該影響控制器的list.item? – Naor

回答

1

我認爲問題是,你正在分配範圍列表中的服務實例,而不是方法的結果。

將其更改爲

angular.module('3pix').controller('ListController', ['$scope', 'jquery', 'list', 
    function ($scope, $, list) { 
     $scope.list = list.loadItems() 
}]); 

您也可以在HTML

ng-repeat="item in list" 
+0

列表還包含我需要的其他屬性。在我的問題中,我把班級減少到了必要的程度。 – Naor

+0

您仍然可以使用列表服務變量。您定義的'list'服務不包含您綁定到的任何項目屬性。所以你要麼綁定promise,要麼綁定在promise上使用'then'方法檢索的返回值。 – Chandermani

+0

我不想在控制器上添加屬性,因爲我已經在List服務中擁有此屬性。除此之外,List還有其他添加項目的方法。有沒有其他方法可以做到這一點? – Naor