2014-04-05 76 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包括头文件。 –