0

我正在将 BreezeJS 与 AngularJS 一起使用,但我很难理解如何让 Promises 与 $scope 一起使用。每当我尝试提交我的表单时,它不会显示验证错误,直到我第二次单击它。我意识到我可以调用 $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 调用(例如 $http,它会在幕后处理 .apply() 本身)。事实上,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 回答