2012-12-29 48 views
9

AngularJS文档sayAngularJS承诺

$ Q承诺通过在角模板引擎,这意味着在模板中,你可以把连接到一个范围的承诺,如果他们得到的价值确认。

那么有人可以解释一下这个fiddle不工作的原因吗?无法更改文本字段值。但是分配承诺$ 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"> 
+0

你能告诉我你是如何分配一个由$ http返回的承诺,它以你想要的方式工作吗? – Dogbert

+0

@Dogbert,这里是伪代码来说明我在说什么: '$ scope.item = $ http({method:'post',url:'/ find/my/item /'}) .then函数(响应){ return response.item; });' 另一个使用$ resource方法的例子可以在这个[tutorial](http://docs.angularjs.org/tutorial/step_11)中找到。从行开始: '请注意,PhoneListCtrl是如何替换的...用$ scope.phones = Phone.query();' –

+0

糟糕,刚创建[测试示例](http://plnkr.co/edit/) VP1Td3WtdM0E7n5HJH3W?p = preview),并且它看起来没有与任何承诺一起工作 –

回答

14

您需要使用那么()函数的承诺对象:

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

你的情况我不认为你需要专业人士濑。 Angular的$ watch系统会照顾好事情。 Just return an object in your function, not a primitive type

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

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

$scope.item = this.getItem(); 
+0

我知道你的意思。我已经更新了我的答案。你必须让角度照顾它(它会自动执行它的$ watch系统)。 – asgoth

+0

你给出的第二个例子看起来并不比第一个简单;) 此外,它不会按预期工作,因为$ http.get()将使用表示_item_的json来解析,而不仅仅是_title_ 因此 ' this.getItem()。then(function(result){scope.item = result; });'看起来完全可以接受(我只是将this.item = result更改为$ scope.item = result) –

+0

啊,确实如此这应该是范围。我会改变它,所以你可以接受它。 – asgoth

1

我相信你的第一小提琴不起作用的原因是因为你scope属性item本质结合的承诺。当您尝试通过在文本字段中键入来更改值时,角度会通知活动,然后将item的值重新赋值/重置为承诺的结果(尚未更改)。

@asgoth提供的解决方案在解决承诺时设置/赋值item一次。这里没有任何约束(即item未被约束),所以通过文本框改变值会改变值。

-1

就像@Mark所说的,在这里你可以找到你的代码片段的Working Example

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

$timeout(function(){ 
    $scope.item = { 
     title: 'Some title' 
    }; // Apply the binding 
    deferred.resolve(); // Resolve promise 
},2000); // wait 2 secs   
+0

你的JavaScript的最后一行可能只是'this.getItem();'。 –