Angularjs 角度分辨率和转换
我正在使用ui router 0.2.0(我知道它是一个较旧的版本,但由于各种原因,我们被锁定在Angular 1.0.8上),并尝试使用Angularjs 角度分辨率和转换,angularjs,promise,angular-ui-router,q,Angularjs,Promise,Angular Ui Router,Q,我正在使用ui router 0.2.0(我知道它是一个较旧的版本,但由于各种原因,我们被锁定在Angular 1.0.8上),并尝试使用resolve:{}来确保控制器处理的是具体的数据,而不是最终的数据(承诺) 我目前有以下情况: resolve: { items: ['listSvc', function (listSvc) { console.log('resovling items'); var items = listSvc.getItems(
resolve:{}
来确保控制器处理的是具体的数据,而不是最终的数据(承诺)
我目前有以下情况:
resolve: {
items: ['listSvc', function (listSvc) {
console.log('resovling items');
var items = listSvc.getItems();
items.then(function () {
console.log('horray!');
});
return items;
}]
}
“项目”现在包含大约八个项目,仅包含一个标题,“我的视图”只执行一次ng重复操作
,并显示每个标题
控制员:
App.controller('MyCtrl', ['$scope', 'items', function ($scope, items) {
console.log('MyCtrl');
$scope.items = items;
}]);
观点:
<div>
<h1>Items</h1>
<div data-ng-repeat="item in items">
{{ item.Title }}
</div>
</div>
我的listSvc也使用Q而不是$Q,如果这很重要的话
是的,是的。这是你的问题
Q是一个比$Q
更完整的承诺实现,它有更多的特性。然而,$q
集成到AngularJS摘要周期中
- 非正式-它通知演示文稿某些内容已更改,需要刷新李>
- 正式-Q使用asap.js模块解析用于快速排队的承诺(最近),而$Q解析evalAsync队列上的承诺。不过,非正式部分在这里更为重要
中应用范围这样的技巧。最后统一使用$q.when(prom)
,这是一种实用方法,它接受一个可信任的(通用承诺)并将其转化为可信的$q
承诺。如果您没有任何运行在$q中的内容,您仍然需要在承诺链的末尾调用$rootScope.$apply()
如果这不起作用,您可以简单地添加
.finally(function(){ $scope.apply(); })
直到你的承诺链的尽头
大多数好的promise库都实现了A+规范,该规范允许将一种promise清晰、简单地同化为另一种promise。由于Q和$Q都是承诺/A+投诉-这意味着您可以非常轻松地在Q和$Q之间进行互操作(因为它们具有相似的.then语义):
当(值)将可能是值或(第三方)的对象包装为$q承诺。当您处理的对象可能是承诺,也可能不是承诺,或者承诺来自不可信任的来源时,这非常有用
在您的情况下-类似于:
var items = $q.when(listSvc.getItems()); // don't forget to inject $q
或者在链中的任何其他点将其包裹在中。您的问题/问题是什么?有时,我看到“horray!”与“horray”之间大约间隔2秒以及由此产生的视图。其他时候我看到“霍瑞!”但是永远不要转换到预期的视图。当直接使用$q
时,我的承诺似乎无法正确解析;当使用$rootScope.$apply()
和q
或$q时()
除非单击父视图文本框,否则我的ui不会更新。这似乎是针对我的应用程序的,因为如果我制作一个类似的jsbin,一切都会正常工作。这种行为是否表明我应该关注某些特定的东西?@RyanHirsch和$scope.apply()
在中。最后,
的Q承诺不起作用?在我的实际应用中不起作用否:(我已经用在我的场景中起作用的内容更新了我的原始问题,但是,根据我在我的应用程序之外测试的所有内容,您的答案是正确的。因此,您明确地将Q承诺转换为$Q承诺和$apply
?我想知道为什么.fin
中的$apply
还不够。有趣。如果您可以创建sample(或以一个错误告终)让我知道我会看一看:)
var items = $q.when(listSvc.getItems()); // don't forget to inject $q