1.2更新后,将角度服务绑定到范围失败

时间:2013-11-12 14:49:39

标签: angularjs promise

我试图删除细节并使其相当普遍......

使用1.2 rc2我的代码工作正常,更新到1.2稳定并纠正$ parse更改后我遇到了绑定问题。在更新之前,以下代码没有任何问题。从html页面调用updateChildObject()

.when('/the-page/', {
  controller: function($scope, serviceResults, FactoryService) {
    $scope.object.childObject = serviceResults;

    // this function used to work. Now assigns the function to the 
    // scope rather than the results
    $scope.updateChildObject = function(args) {
      $scope.object.childObject = FactoryService.getSomethingFromServer(args);
    };

  },
  resolve: {
    serviceResults: function(FactoryService) {
      return FactoryService.getSomethingFromServer(args);
    }
  }

由于现在失败了($ scope.object.childObject似乎被设置为函数而不是结果)我相信解决它的合适方法是通过一个承诺。 (注意,服务本身正在成功使用promise。)但是,在解析promise时,我很难让$ scope更新。

我相信以下代码是正确的。 $ q被注入控制器。

...
$scope.updateChildObject = function(args) {
  var defer = $q.defer();
  defer.promise.then(function() {
    return FactoryService.getSomethingFromServer(args);
  });
  $scope.object.childObject = defer.resolve();
};
...

所以有人能说出我在这里做错了吗?承诺只是那些尚未真正为我点击过的东西之一。

2 个答案:

答案 0 :(得分:2)

作为您答案的替代方案:您说FactoryService已经成功使用了承诺,在这种情况下,您似乎也不需要updateChildObject中的额外承诺。您可以更新FactoryService.getSomethingFromServer(args)以返回承诺(即最后使用return defer.promise;并在异步位中使用defer.resolve(results);),然后将updateChildObject简化为:

$scope.updateChildObject = function(args) {
  FactoryService.getSomethingFromServer(args).then(function(results) {
     $scope.object.childObject = results;
  }
};

此外,值得了解Angular 1.2故意破坏早期版本中的自动承诺展开:https://github.com/angular/angular.js/issues/4158。以前是这个代码

的情况
$scope.updateChildObject = function(args) {
     $scope.object.childObject = FactoryService.getSomethingFromServer(args);
};

与上面的相同(假设getSomethingFromServer返回一个promise),但不再是。这可能是您在1.2

中遇到的问题

答案 1 :(得分:0)

弄清楚我做错了什么。绝对是一个承诺问题,因为我没有正确使用它们。以下解决了这个问题:

...
$scope.updateChildObject = function(args) {
    var defer = $q.defer();
    defer.promise.then(function(results) {
        $scope.object.childObject = results;
    });
    defer.resolve(FactoryService.getSomethingFromServer(args));
};
...

所以defer.resolve会调用要解决的问题。 promise.then()将结果传递给下一个动作。这么简单。