2014-04-05 108 views
0

我想通過負載上的控制器在angular.js中調用一個服務並返回一個承諾。然後我期望履行承諾並更新DOM。這不是發生了什麼。要清楚,我沒有收到錯誤。代碼如下。AngularJS:服務數據綁定

app.controller('TutorialController', function ($scope, tutorialService) { 
    init(); 
    function init() { 
     $scope.tutorials = tutorialService.getTutorials(); 
    } 
}); 

<div data-ng-repeat="tutorial in tutorials | orderBy:'title'"> 
    <div>{{tutorial.tutorialId}}+' - '+{{tutorial.title + ' - ' + tutorial.description}}</div> 
</div> 

var url = "http://localhost:8080/tutorial-service/tutorials"; 

app.service('tutorialService', function ($http, $q) { 
    this.getTutorials = function() { 
     var list; 
     var deffered = $q.defer(); 
     $http({ 
      url:url, 
      method:'GET'   
     }) 
     .then(function(data){ 
      list = data.data; 
      deffered.resolve(list); 
      console.log(list[0]); 
      console.log(list[1]); 
      console.log(list[2]); 

     }); 
     return deffered.promise; 
    }; 
}); 

裏面的「那麼()」中的服務功能,我記錄結果,我得到什麼我希望在那裏,它只是從來沒有更新DOM。任何和所有的幫助,將不勝感激。

回答

2

getTutorials自行返回承諾。所以你必須再次做then()

tutorialService.getTutorials().then(function(data){ 
    $scope.tutorials = data; 
}); 

在此之前,$http返回與success()error()一個承諾。

雖然你也可以使用then以及

由於調用$ HTTP函數的返回值是一個承諾, 您還可以使用則方法註冊回調,而這些 回調將接收一個參數 - 一個代表響應的對象。

所以你是正確的。

0

來自http調用的數據是什麼樣的?您的代碼有效 - 我在此創建了一個版本http://jsfiddle.net/Cq5sm/,使用$timeout

所以,如果您的列表如下所示:

[{ tutorialId: '1', 
    title : 'the title', 
    description: 'the description' 
}] 

它應該工作

0

在較新的角度版本(我認爲V 1.2 RC3 +),你必須的角度配置以獲得解包功能工作(DEMO) :

var app = angular.module('myapp', []).config(function ($parseProvider) { 
    $parseProvider.unwrapPromises(true); 
}); 

這允許您直接將承諾分配給ng-repeat集合。

$scope.tutorials = tutorialService.getTutorials(); 

除此之外,我個人更喜歡做手工包裝:

tutorialService.getTutorials().then(function(tutorials){ 
    $scope.tutorials = tutorials; 
}); 

我不知道爲什麼他們移除了默認配置該功能的確切原因,但它看起來像角開發者更喜歡第二個選項也是如此。

+0

我猜想,因爲它變得透明,使用'then'表示承諾是從底層調用返回的。我更喜歡它。 :) – dmahapatro

+0

這可能的確是原因,這也是我更喜歡自己包裝的原因之一。另一個當然是我已經配置了restangular,總是給我完整的repsonse包括頭文件。 –