【问题标题】:AngularJS: Resolve in RouteProvider - detecting Success / Failure?AngularJS:在 RouteProvider 中解决 - 检测成功/失败?
【发布时间】:2013-07-18 13:03:42
【问题描述】:

我已经解决了我的路由提供程序,但我只是返回了承诺,所以我不知道它是成功还是失败。这就是我所拥有的

.when('/items', {
    templateUrl: 'views/items.html',
    controller: 'ItemsCtrl',
    resolve: {
        resolvedData: function(Restangular) {
            return Restangular.one('Items').get();
        }
    }
})

现在这确实有效,但我如何检测成功或失败。我可以在 resolve 方法中输入这个,但是在成功和失败中我会返回什么。记住我需要将项目注入到我的控制器中。

.when('/items', {
    templateUrl: 'views/items.html',
    controller: 'ItemsCtrl',
    resolve: {
        resolvedData: function(Restangular) {
            Restangular.one('Items').get().then(function(data) {
                // success
            }, function() {
                // failure
            });
        }
    }
})

我确实在这里看到了一个示例,但我很困惑这是否是我需要的以及如何使用它?

AngularJS - rejected $http promise with $routeProvider:resolve

它似乎正在返回一个手动承诺。

resolve: {
    response: ['Warranty'
        '$q',
        function(Warranty, $q) {
            var dfd = $q.defer();
            Warranty.sendRequest().then(function(result) {
                dfd.resolve({
                    success: true,
                    result: result
                });
            }, function(error) {
                dfd.resolve({
                    success: false,
                    reason: error
                });
            });
            return dfd.promise;
        }
    ]
}

我真正想做的是在我的控制器中将已解析的变量注入控制器,如果它失败了,那么我也想访问控制器中的故障,以便向用户显示它不是'由于问题无法呈现。

【问题讨论】:

    标签: angularjs angularjs-routing


    【解决方案1】:

    你可以只返回then方法的返回值:

    resolve: {
        resolvedData: function(Restangular){
            return Restangular.one('Items').get().then(function (data) {
                ...
                return successData; // resolvedData will be resolved with the successData
                }, function () {
                ...
                return failureData; // resolvedData will be resolved with the failureData
                });
        }
    }
    

    then 方法doc

    这个方法返回一个新的promise,它通过successCallback或errorCallback的返回值被解析或拒绝。

    【讨论】:

    • 啊,太好了,在我的控制器中,我如何确定我注入的值是成功还是失败??
    • 返回一个对象如{success: true, data: ...}
    【解决方案2】:

    如果解析功能失败,您可能希望向用户显示相应的内容(如错误消息)。 最好让你的 resolve 函数返回一个 promise(不带 then)并使用内部事件 $routeChangeError

    myApp.run(['$rootScope',function($rootScope) {
      $rootScope.$on('$routeChangeError', function() {
        // what you want to do if an error occurs 
        // ex: $rootScope.displayErrorMessage = true
      });
    

    ])

    处理一般错误(如网络错误/服务器停机等)也会更容易。

    【讨论】:

      猜你喜欢
      • 2019-10-25
      • 2010-12-14
      • 2013-07-17
      • 1970-01-01
      • 2022-12-06
      • 1970-01-01
      • 2012-11-04
      • 2013-06-25
      • 1970-01-01
      相关资源
      最近更新 更多