10

AngularJS 文档

$q promises 被 Angular 模板引擎识别,这意味着在模板中,您可以将附加到范围的 Promise 视为结果值。

那么有人可以解释一下这个小提琴不起作用的原因吗?无法更改文本字段值。但是,将 $http 服务返回到范围字段的承诺分配起来就像一个魅力。

控制器:

function MyController($scope, $q, $timeout) {
    this.getItem = function () {
        var deferred = $q.defer();
        deferred.resolve({
            title: 'Some title'
        });
        return deferred.promise;
    };

    $scope.item = this.getItem();
}

html:

<input type="text" ng-model="item.title">
4

3 回答 3

14

您需要在 promise 对象上使用 then() 函数:

this.getItem().then(function(result) {
   $scope.item = result;
});

在你的情况下,我认为你不需要承诺。Angular 的 $watch 系统会处理这些事情。只需在函数中返回一个对象,而不是原始类型

this.getItem = function () {
    var item = {};

    // do some async stuff
    $http.get(...).success(function(result) {
       item.title = result;
    });
    return item;
};

$scope.item = this.getItem();
于 2012-12-29T10:31:53.057 回答
1

我相信你的第一个小提琴不起作用的原因是因为你本质上是将范围属性绑定item到一个承诺。当您尝试通过在文本字段中键入来更改值时,角度会注意到活动,然后将值重新分配/重置为item承诺的结果(未更改)。

item当 promise 被解决时,@asgoth 提供的解决方案设置/分配一次的值。这里没有绑定(即item不绑定到承诺),因此通过文本框更改值确实会更改值。

于 2012-12-29T18:07:46.020 回答
-1

就像@Mark 说的,在这里你可以找到你的代码片段的工作示例

基本上你是在返回一个对象而不是绑定模型本身。

$timeout(function(){
   $scope.item = {
      title: 'Some title'
   }; // Apply the binding
   deferred.resolve(); // Resolve promise
},2000); // wait 2 secs           
于 2012-12-29T19:36:03.933 回答