1

詳細を取り除いて、これをかなり一般化しようとしました...

1.2 rc2 を使用すると、私のコードは正常に動作しました。1.2 安定版に更新し、$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 は結果ではなく関数として設定されているように見えます)、それを解決する適切な方法は約束によるものだと思います。(サービス自体が 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();
};
...

ここで私が間違っていることを誰かに教えてもらえますか?約束は、私がまだ実際にクリックしていないものの1つにすぎません。

4

2 に答える 2

2

あなたの答えの代わりとして、あなたは FactoryService が既に promise を正常に使用していると言っています。その場合、追加の promise も必要ないようですupdateChildObjectFactoryService.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 は、以前のバージョンにあった自動 promise アンラップを意図的に破っていることを知っておく価値があります: https://github.com/angular/angular.js/issues/4158。以前は、このコードは

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

上記のものと同じように機能します (getSomethingFromServer が promise を返すと仮定します) が、もう機能しません。これは、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 に答える