【问题标题】:AngularJS: Unable to pass a factory's $http.get result to the controller (via $routeProvider)AngularJS:无法将工厂的 $http.get 结果传递给控制器​​(通过 $routeProvider)
【发布时间】:2015-06-04 03:45:24
【问题描述】:

我有一个想要重用的 CRUD 操作,所以我有一个通过 $routeProvider/resolve 传递给控制器​​的工厂。

但我看到控制器在工厂的 GET 请求返回之前解析。 如何设置承诺,使 $routeProvider 不会将 undefined 传递给控制器​​?

我的例子:

angular
  .module('app',['ngRoute'])
  .config(config)
  .controller('appController', appController)
  .factory('appFactory', appFactory);

function config($routeProvider){
  $routeProvider
    .when('/',{
      templateUrl: 'template.html',
      controller: 'appController',
      resolve: {
        server_stuff: function(appFactory){
          // logging
          console.log('appFactory.serverReponse = '+ appFactory.serverResponse() );
          return appFactory.serverResponse();
        }
      }
    });
}

function appController( $scope, server_stuff ){
  $scope.content = server_stuff;
  // logging
  console.log('server_stuff = '+server_stuff);
}

function appFactory($http){
  var i = 1;
  var appFactory = {
      serverResponse: serverResponse
  };
  // logging
  console.log('Factory execution');
  return appFactory;

  function serverResponse(){
    // logging
    console.log('pre-GET ' + i);
    $http.get('/endpoint/')
      .success(function(data){
        // logging
        console.log('GET is done ' + i);
        i++
        return data;
      });
  }
}

日志输出:

'Factory execution'
'pre-GET 1'
'appFactory.serverReponse = undefined'
'pre-GET 1'
'server_stuff = undefined'
'GET is done 1'
'GET is done 2'

我的更改:

路由器解析:我选择传递$http函数,稍后执行

return appFactory.server; // no paren

工厂简化:

return $http.get('/endpoint/);

控制器:利用注入的工厂作为它应该是的服务器调用......

function appController( $scope, server_stuff ){
  server_stuff().success( function(data){
    // do stuff with the server info
});

【问题讨论】:

  • return data; 在您的 .success 中不会从 severResponse 返回 data。你应该直接返回承诺。

标签: angularjs angular-ui-router promise


【解决方案1】:

正如@KevinB 所说,在工厂中使用 $http 调用应该是这样的:

在你的工厂

  function serverResponse(){
    // logging
    console.log('pre-GET ' + i);
    return $http.get('/endpoint/')
      .success(function(data){
        // logging
        console.log('GET is done ' + i);
        i++
      });
  }

在控制器中:

 MyFactory.serverResponse().success(function(data){
      //your controller handling of the data.
 });

在路由器中解析:

resolve: {
        server_stuff: function(appFactory){
          return appFactory.serverResponse();
        }
      }

您的路由器解析将自行处理 $http 调用的成功。

【讨论】:

  • 谢谢 KevinB 和 Okazari。这无疑帮助我将 $http 承诺转移到了它可以工作的地方。
猜你喜欢
  • 2014-05-02
  • 1970-01-01
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-30
相关资源
最近更新 更多