我正在使用BreezeJS和AngularJS,但我很难理解如何让Promise与$ 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内部的范围变更的最佳方法是什么?
答案 0 :(得分:2)
是的,你在这里需要$ scope.apply,因为承诺不是来自一个核心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之外创建的承诺时,它会出现。