1

我试图去除细节并使其相当概括......

使用 1.2 rc2 我的代码运行良好,在更新到 1.2 stable 并更正 $parse 更改后,我遇到了绑定问题。在更新之前,以下代码可以正常工作。updateChildObject()从 html 页面调用。

.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 似乎被设置为函数而不是结果)我相信解决它的适当方法是通过承诺。(请注意,服务本身正在成功使用承诺。)但是,当承诺解决时,我很难让 $scope 更新。

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

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

那么谁能告诉我我在这里做错了什么?承诺只是我还没有真正点击的那些事情之一。

4

2 回答 2

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 返回一个承诺),但不再是。这可能是您在 1.2 中遇到的问题

于 2013-11-12T17:06:27.560 回答
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() 将结果传递给下一个动作。很简单。

于 2013-11-12T16:54:18.527 回答