5

Angular 的 $q 文档说“$q 承诺被 Angular 的模板引擎识别,这意味着在模板中你可以将附加到范围的承诺视为结果值。”

Angular 的视图模板还允许您评估表达式,这意味着您可以调用从作用域公开的函数。

我发现视图模板能够引用真实值、承诺(最终解析为真实值)或返回真实值的函数,但不能引用返回承诺的函数,它们总是呈现{}到视图模板中。

用这个例子创建了一个小提琴

谁能做得更好或引导我朝着正确的方向前进?

(也许在视图模板中使用函数是个坏主意;这种技术还有其他问题,因为 Angular 监视函数在不调用函数的情况下无法判断它是否已更改,因此监视的函数在每个摘要循环中都会被评估。我已经看过这两个 问题,在这两个问题中,推荐的答案是使用 promise.then 更改范围上的普通属性,并让视图模板监视普通属性而不是承诺。我明白了,但是对于我的使用,我想提供一些参数来计算一个值,并且直接在视图模板中提供这些参数很方便。基本上我正在尝试在FlaskRails中编写类似 url_for 的东西。)

4

2 回答 2

2

我不太确定,但如果你返回一个带有 Promise 作为属性的对象,它就可以工作。 (小提琴)

var deferred2 = $q.defer();
$scope.po = { promise: deferred2.promise };
$scope.getPo = function() {
    return $scope.po;
};

$timeout(function() {
    deferred2.resolve('some lazy text');
}, 2000);

HTML:

<p>Function returning promise (object): {{ getPo().promise }}</p>
于 2013-10-24T04:42:47.893 回答
0

Promise代表一个未来值,通常是异步操作的未来结果,并允许我们定义一旦该值可用或发生错误时会发生什么。

参考

var promise = asyncFunction(parameters); 

promise.then( 
 function (result) { 
 // Do Something with the result 
 }, 
 function (error) { 
 // Handle error (exception, etc). 
 }); 

您可以使用实用程序方法用 Promise 包装任何值$q.when()

  • $q.when(promise) → 承诺
  • $q.when(nonPromise) → 一个新的承诺,它将
  • 异步解析为给定值 nonPromise。

===============================

在您的示例中:

HTML

<div ng-app ng-controller="testController">
    <p>Direct property: {{ property }}</p>
    <p>Function returning property: {{ getProperty() }}</p>
    <p>Direct promise: {{ promise }}</p>
    <p>Function returning promise: {{ out }}</p>
</div>

JS

function testController($scope, $q) {
    var deferred = $q.defer();
    deferred.resolve('some lazy text');
    $scope.promise = deferred.promise;

    $scope.out = $scope.promise.then(function (result) {
        console.log(result);
        return result;
    });


    $scope.property = 'some text';
    $scope.getProperty = function () {
        return $scope.property;
    };
}

演示小提琴

于 2013-10-23T22:31:15.387 回答