【问题标题】:Is it ok to do the $http get request on ui.router's resolve in angularjs?可以在 angularjs 中对 ui.router 的解析执行 $http 获取请求吗?
【发布时间】:2015-07-22 12:07:35
【问题描述】:

我有以下代码(如下),它们非常适合我并且至少可以满足我的需要。但我对此持怀疑态度,我觉得它太好了,难以置信。由于我正在为$http 的异步行为而苦苦挣扎,这对我在控制器上全局使用来自$http 请求的响应对象有很大帮助。

我只是想知道它是否是正确的方式,或者至少是可接受的方式,或者在我继续我的项目之前,我应该使用$http 的传统方式,就像AngularJS' Documentation 上的方式一样。答案对我有很大帮助。谢谢你。

$stateProvider

$stateProvider
    .state('test', {
        url: '/test',
        templateUrl: 'partial.template.html',
        resolve : {
            foo : function($http) {
                return $http({
                    method: 'GET',
                    url: '/api/something'
                });
            },
            bar : function($http) {
                return $http({
                    method: 'GET',
                    url: '/api/something'
                });
            },
        },
        controller: 'mainController',
    })

控制器

.controller('mainController',['$scope', 'foo', 'bar', function($scope, foo, bar){
    $scope.fooObj = foo;
    $scope.barObj = bar;
}])

【问题讨论】:

  • 对我来说看起来不错。这就是 resolve 的用途。你有什么顾虑?
  • 在路由器文档中甚至有这样的例子
  • @Thomas 我在想这可能不是最好的方法,我不想花时间在这种方法上投资,然后在未来它可能会导致我的世界崩溃(哈哈) .如果你说没问题,那我相信你。谢了哥们。 :)
  • @charlietfl 是这样吗?谢啦。 :)

标签: javascript angularjs http resolve


【解决方案1】:

我认为这可能是 ui-router 解析的最佳用例。

无论如何,我更愿意将我的 http 调用包装到服务中,并将此服务调用到解析中,而不是直接使用 $http。

这可能看起来像这样:

app.service('FooService',function($http){
  var service={}; 
  service.getFoo = function(){
      return $http({
                method: 'GET',
                url: '/api/something'
             });
  }
  return service;
});

多亏了你可以在你的应用程序中调用这个方法(同时集中它)。

在控制器中:

app.controller('MyController', function($scope, FooService) {
    $scope.controllerName = "MyController";
    FooService.getFoo().success(function(foo){
        $scope.foo = foo
    });
});

在一个解决方案中:

$stateProvider
.state('test', {
    url: '/test',
    templateUrl: 'partial.template.html',
    resolve : {
        foo : function(FooService) {
            return FooService.getFoo();
        },
    },
    controller: 'MyController',
})

继续使用这种方法,你的方法很好。

希望对您有所帮助。

编辑:构建了一个plunker 以添加这些方法的具体示例。

【讨论】:

  • 嗯,实际上我在这种方法上遇到了一点问题。似乎解析正在阻止加载模板?这很奇怪,但控制台上没有错误。
  • 是的,实际上模板不会加载,直到解析中的承诺得到解决。如果您不想要这个,只需保留服务并使用“控制器”示例。你可以添加一些加载器,它就像一个魅力。
  • 这听起来可能是新手,但我该如何解决这个承诺?
  • 其实现在好了。谢谢:)
  • @GreenFox 在答案中添加了一个 plunker 来说明。实际上,当您收到响应时, $http 承诺已解决。你不必自己做。处理 $http 响应可以在控制器中使用 .success(function(data)) 完成,并在解析中自动完成(您将使用“property.data”获取数据)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
相关资源
最近更新 更多