Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 范围从承诺内部更改_Javascript_Angularjs_Breeze - Fatal编程技术网

Javascript 范围从承诺内部更改

Javascript 范围从承诺内部更改,javascript,angularjs,breeze,Javascript,Angularjs,Breeze,我正在使用BreezeJS和AngularJS,但我很难理解如何获得与$scope合作的承诺。每当我尝试提交表单时,它都不会显示验证错误,直到我第二次单击它。我意识到我可以调用$scope.$apply(),但我读到它不是最佳实践?这是我的密码: app.controller("MainController", ["$scope", "$q", "datacontext", function ($scope, $q, datacontext) { datacontext.manager.

我正在使用BreezeJS和AngularJS,但我很难理解如何获得与$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();
            });
    };
}]);

处理来自承诺内部的范围更改的最佳方法是什么?

是的,您需要$scope.apply,因为承诺不是来自核心角度调用(例如$http,它会在幕后处理.apply()本身)。事实上,BreezeJS页面()上的Breeze/Angular示例在其数据检索后包含一个$scope.apply():

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

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

将$scope.apply()扔到不需要它的地方是一种糟糕的做法。但是,当您处理Angular自身之外创建的承诺时,它会出现。

在不需要的地方使用
$scope.$apply()
不是最佳做法。。。但这正是它所要面对的情况。