Resolve必须包含所有承诺甚至来自控制器吗?

时间:2016-03-03 16:27:41

标签: angularjs angular-ui-router

可能它就像我想的那样简单,但我无法在互联网上找到我的问题的答案,所以我希望你们只需看一小段我的代码就能知道答案。

问题:我在Angular中使用UI路由器,它在加载所有数据之前加载模板。因此,所有输入字段在模板已加载后都会收到正确的值。所以输入字段是空的一两秒......

我认为我的决心不应该如此:

所以我的ui-router代码看起来像这样(检查解析对象):

 position: fixed;   

现在控制器包含从API URL获取一些数据的承诺:

$stateProvider.state('teststate', {
    url: '/test/',
    templateUrl: 'app/page/template.html',
    controller: 'testCtrl',
    resolve: {
        access: ["Access", function(Access) { return Access.isAuthenticated(); }],
        UserProfile: 'UserProfile'
    }
});

现在服务(连接到API)应该向Controller返回承诺:

function TestCtrl($scope, $state, $stateParams, TestService) {

    TestService.get($stateParams.id).then(function(response) {
        $scope.data = response;
    });
}

现在问题可能是,因为Controller中的TestService.factory('TestService', ['Restangular', function(Restangular) { var factory = {}; factory.get = function(id) { return Restangular.one('api/test', id).get(); } return factory; }]); (连接到API)在模板加载之前不会执行,因为它不在TestService.get()对象中?那么UI路由器无法解析对API的调用?我只是好奇或者我应该将进行API调用的所有方法移动到resolve内每个统计信息的解析对象。

我可以进行很多测试,但如果有人只是通过查看这个问题直接知道答案,那对我有很大帮助。

2 个答案:

答案 0 :(得分:0)

您的假设都是正确的。

如果解析路由配置中的TestService.get,控制器可以将数据作为可注入资源随时使用

答案 1 :(得分:0)

如果您不想在完成所有API调用之前运行控制器并显示模板,则必须将所有这些调用放在ui-routers resolve中。

但是,如果API请求可能需要一段时间,那么在您的API调用正在运行时,立即过渡到新页面并显示某种加载指示符(例如block-ui)似乎会更好。