2014-01-11 65 views
1

更新:我挖得更深一点,发现在1.2.0之后的角度已弃用auto-unwrapping of promisesAngular JS承诺评估

我知道Angular JS会评估作为承诺的范围变量,然后在履行承诺时更新控制器的视图。

我的问题是:

http://jsfiddle.net/dhruvkaran/Lv5vF/4/

<div ng-app="myApp"> 
    <div ng-controller="DemoController"> 
    {{foo}} 
    </div> 
</div> 

<script> 
    var myApp = angular.module("myApp", []); 

    myApp.controller('DemoController', function($scope) { 
    $scope.foo = "bar"; 
    }); 
</script> 

作品就好了,但是,

http://jsfiddle.net/dhruvkaran/Lv5vF/5/

<div ng-app="myApp"> 
    <div ng-controller="DemoController"> 
    {{foo}} 
    </div> 
</div> 

<script> 
    var myApp = angular.module('myApp', []); 

    myApp.controller('DemoController', function($scope, $q) { 
    var deferred = $q.defer(); 
    deferred.resolve("bar"); 
    $scope.foo = deferred.promise; 
    }); 
</script> 

没有。

我在这里做错了什么?

回答

3

您错误地使用了承诺。承诺是未来某个时候将会实现的承诺,或者被解决或被拒绝。另外:范围变量不一定是一个承诺,所以这可能是你感到困惑的地方。要正确使用的承诺,则需要使用承诺的“那么”功能添加回调:

myApp.controller('DemoController', function($scope, $q) { 
    var deferred = $q.defer(); 
    deferred.resolve("bar"); 

    //Note: Promises are not normally resolved inline like above 
    deferred.promise.then(function (data) { 
    $scope.foo = data; 
    }); 

}); 
+0

在这种情况下它不会帮助,因为函数注册处理它之前承诺解决。 –

+0

您可以在任何回调注册到承诺之前实际解决承诺。 OP的代码jsfiddle:http://jsfiddle.net/Lv5vF/6/ – Patrick

+0

很高兴知道谢谢! –