函数的$ q promise在解析时没有将其值传播到Angular视图中

时间:2013-03-18 23:02:36

标签: javascript angularjs angularjs-directive angularjs-scope

出于某种原因,当我从范围函数返回$q承诺时,该值永远不会在分辨率上传播:

app.controller('MainCtrl', function($scope, $q) {
    var deferred = $q.defer();
    deferred.resolve("hello");
    var promise = deferred.promise;

    $scope.promiseReturn = function() {
        return promise;
    };
});

观点:

<body ng-controller="MainCtrl">
    <p>promiseReturn: {{promiseReturn()}}</p>
</body>

Here's a Plunker for this code。该视图最终看起来像:

promiseReturn: {}

我的理解似乎是模板引擎会相当透明地处理$q承诺。

1 个答案:

答案 0 :(得分:4)

$q承诺可以直接附加到范围,并且在解决后,它们的值将导致视图更新(并且将使用它们的已解析值),但它们不能是范围函数的返回值

如果从作用域上的函数返回promise,则返回值按原样使用。 promise看起来像对象{then: function() { ... }},而Angular的JSON序列化器忽略了具有函数值的键,因此您只需在视图中获得{}Here's a Plunker demonstrating this

Angular在几个地方处理这个问题;您可以在parse.js中找到一些内容(搜索.then)。