如何使用未实现的承诺处理Angular-UI-Router解决方案?

时间:2015-08-09 14:03:35

标签: javascript angularjs angular-ui-router

假设我有一个角度ui路由器路由设置。当我改变到那个状态时,我告诉Angular我希望它首先解决工厂调用,然后加载视图。但是当api调用为空时会发生什么?我想告诉用户没有找到结果并保持原状态。不转换到没有要显示的数据的另一个视图。实现这一目标的最佳方法是什么?

路线(到目前为止,当我知道会有回报时,它会按预期工作)

'use strict';

angular.module('testApp')
.config(function ($stateProvider) {
    $stateProvider
        .state('spinnerTest', {
            url: '/spinner_test',
            templateUrl: 'app/spinnerTest/spinnerTest.html',
            controller: 'SpinnerTestCtrl',
            resolve: {

                names: function(NamesService){

                    //What happens if I return an empty array []?
                    //How do I return to the previous state?
                    NamesService.getNames();
                }
            }
        });
  });

3 个答案:

答案 0 :(得分:1)

如果是空数组,您可以简单地拒绝承诺:

resolve: {
     names: function(NamesService) {
         return NamesService.getNames().then(function(names) {
             return names.length == 0 ? $q.reject('no names') : names;
         });
     }
 }

答案 1 :(得分:0)

这是一个跨领域的问题,它可能不是名称服务所特有的,而是您正在使用的其他服务。

由于您没有将代码发布到Name服务(NameService服务是多余的),我将假设它使用$ http或$ resource服务。然后,您可以使用$ httpInterceptor触发向用户显示“此时选择不可用”的消息。

答案 2 :(得分:0)

如果您愿意

,可以在决心中致电$state.go
'use strict';

angular.module('testApp')
.config(function ($stateProvider) {
    $stateProvider
        .state('spinnerTest', {
            url: '/spinner_test',
            templateUrl: 'app/spinnerTest/spinnerTest.html',
            controller: 'SpinnerTestCtrl',
            resolve: {

                names: function(NamesService, $state){

                    //What happens if I return an empty array []?
                    //How do I return to the previous state?
                    return NamesService.getNames().then(function(names){
                      if (!names.length) {
                        return $state.go('otherState');
                      }
                      return names;
                    });
                }
            }
        });
  });