2013-06-25 90 views
0

我正在使用BreezeJS和AngularJS,但我很难理解如何让Promise与$ scope一起工作。每当我尝试提交表单时,都会显示验证错误,直到第二次点击。我意识到我可以调用$ scope。$ apply(),但我读到它不是最佳做法?这里是我的代码:范围从Promise中更改

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(); 
      }); 
    }; 
}]); 

什么是最好的方式来处理范围内的变化来自一个承诺内部?

+2

使用'$ scope。$ apply()'只是'不是最佳实践',不需要它......但这正是它的目的。 http://jimhoskins.com/2012/12/17/angularjs-and-apply.html – thefrontender

回答

2

是的,你将需要$ scope.apply在这里,因为承诺不是来自核心的Angular调用(例如$ http,它可以在幕后处理.apply()本身)。事实上,BreezeJS页面(http://www.breezejs.com/samples/todo-angular)在微风/角例子包括$ scope.apply()的数据检索后:

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

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

这是一个不好的做法,scope.apply $折腾()约你在哪里不需要它。但是当你处理在Angular之外创建的promise时,它就会出现。