2014-04-28 87 views
0

我的表具有這樣的代碼(玉表示法):角度內插使用「異步」功能

table.displaytable 
tbody 
    tr(ng-repeat="item in itemList"): td 
    b {{item.Id}} 
    td {{getTypeName(item.TypeId)}} 

和getTypeName實際上是在調用一些異步序列:

$scope.getTypeName = function (typeId) { 
      var lang= CurrentLanguageService.getCurrentCulture(); 
      var label= TypesService.getLabelAsync(typeId, lang); 
      return label; 
     } 

其中服務我有功能定義爲

var getLabelAsync = function (id, langCulture) { 
     return loadPromise(langCulture).then(function (data) { 
        return data; 
       } 

我有以下問題:

  1. 我是否正確使用promise的數據從我的getLabelAsync()返回實際的「標籤」?

  2. 爲什麼我看到多個調用來解決承諾(即觸發三個調用服務器),而我只有一行表插入?

  3. 我也越來越

    錯誤:[$插值:INTERR]不能插:{{getTypeName(item.typeId)}} 類型錯誤:無法讀取空的屬性 '然後'

+0

不,這是使用一個承諾走錯了路。承諾發生異步,這也應該是你的函數調用。 – shaunhusain

回答

0
var getLabelAsync = function (id, langCulture) { 
     return loadPromise(langCulture); //Just return the promise that will later resolve 
} 

如果你需要使自己的承諾,你想,你可以使用延遲= $ q.defer稍後的時間來解決();並返回deferrred.promise;那麼在回調函數中,您可以調用deferred.reject或deferred.resolve來最終解決您創建的新承諾。如果您有多個承諾並且您想知道何時全部解決,您還可以使用$ q.all。

0

不知道你正在使用正確的承諾就應該是這樣的:

myApp.service('someservice',function($q,$http){ 

this.someFunction = function() { 
       var defer = $q.defer(); 
       //do some ajax call here 
       $http.get('blah.html',function(data){ 
        // pass data to your promise then function 
        defer.resolve(data); 
       }); 
       //return your promise 
       return defer.promise; 
      } 

}); 

你會使用這樣的:

functionc Ctrl($scope,someservice) { 
    someservice.someFunction().then(data) { 
     console.log(data); 
    }; 
}