Angularjs 角度分辨率和转换

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(

我正在使用ui router 0.2.0(我知道它是一个较旧的版本,但由于各种原因,我们被锁定在Angular 1.0.8上),并尝试使用
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