我正在寻找链接承诺来填充我的范围,然后让范围自动更新dom.
我遇到了这方面的问题.如果我在已经解决的承诺上调用"then",它会创建一个新的承诺(它将异步调用成功函数,但几乎立即调用).我认为问题是我们已经在调用成功函数时离开了摘要周期,所以dom永远不会更新.
这是代码:
<div ng-controller="MyCtrl">
Hello, {{name}}! <br/>
{{name2}}<br/>
<button ng-click="go()">Clickme</button><br/>
{{name3}}
</div>
var myApp = angular.module('myApp',[]);
function MyCtrl($scope, $q) {
var data = $q.defer();
setTimeout(function() {$scope.$apply(data.resolve("Some Data"))}, 2000);
var p = data.promise;
$scope.name = p.then(angular.uppercase);
$scope.name2 = p.then(function(x) { return "Hi "+x;});
$scope.go = function() {
$scope.name3 = p.then(function(x) {
// uncomment this to make it work:
//$scope.$apply();
return "Finally: "+x;
});
};
}
Run Code Online (Sandbox Code Playgroud)
是否有某种方法可以在每次连接承诺时都不用调用$ apply来完成这项工作?
我们对我们的控制器进行单元测试.我们已成功模拟对REST服务层的调用,并验证它确实是使用给定数据调用的.然而,现在我们想在我们的控制器中测试thenpromise 的执行会改变location.path:
控制器:
(function () {
app.controller('registerController', ['$scope', '$location', '$ourRestWrapper', function ($scope, $location, $ourRestWrapper) {
$scope.submitReg = function(){
// test will execute this
var promise = $ourRestWrapper.post('user/registration', $scope.register);
promise.then(function(response) {
console.log("success!"); // test never hits here
$location.path("/");
},
function(error) {
console.log("error!"); // test never hits here
$location.path("/error");
}
);
};
Run Code Online (Sandbox Code Playgroud)
$ourRestWrapper.post(url,data)只是包裹Restangular.all(url).post(data)..
我们的测试:
(function () {
describe("controller: registerController", function() {
var scope, location, restMock, controller, q, deferred;
beforeEach(module("ourModule"));
beforeEach(function() {
restMock = {
post: …Run Code Online (Sandbox Code Playgroud)