0

私は AngularJS で BreezeJS を使用していますが、Promise を $scope で動作させる方法を理解するのに苦労しています。フォームを送信しようとすると、2 回目にクリックするまで検証エラーが表示されません。$scope.$apply() を呼び出すことができることはわかっていますが、ベストプラクティスではないことを読みましたか? これが私のコードです:

app.controller("MainController", ["$scope", "$q", "datacontext", function ($scope, $q, datacontext) {
    datacontext.manager.fetchMetadata();
    $scope.errors = [];

    $scope.addDamp = function () {
        var item = datacontext.manager.createEntity("Damp", {
            name: $scope.newDamp
        });

        var tes = datacontext.manager.saveChanges()
            .then(function () {
                alert("yay");
            })
            .fail(function (error, a, b, c) {
                var arr = [];
                error.entitiesWithErrors.map(function (entity) {
                    entity.entityAspect.getValidationErrors().map(function (validationError) {
                        arr.push(validationError.errorMessage);
                    });
                });
                $scope.errors = arr;
                datacontext.manager.rejectChanges();
            });
    };
}]);

Promise 内からのスコープ変更を処理する最良の方法は何ですか?

4

1 に答える 1

2

はい、ここで $scope.apply が必要になります。これは、Promise がコア Angular 呼び出し (舞台裏で .apply() 自体を処理する $http など) から出ていないためです。実際、BreezeJS ページ ( http://www.breezejs.com/samples/todo-angular ) の Breeze/Angular の例には、データ取得後に $scope.apply() が含まれています。

   datacontext.getAllTodos()
              .then(success)
              .fail(failed)
              .fin(refreshView); 

  function refreshView() {
      $scope.$apply();
  }

必要のないところで $scope.apply() をトスするのは悪い習慣です。しかし、Angular 自体の外部で作成された promise を処理している場合は、問題が発生します。

于 2013-06-25T02:02:31.947 に答える