Javascript $http调用与角度路由

Javascript $http调用与角度路由,javascript,angularjs,Javascript,Angularjs,我只是在我的angular应用程序中设置路线。第一个视图,List进行http调用以获取演示文稿列表 function ListController($scope, $http) { $scope.error = null; $scope.presentations = null; $scope.requesting = true; $scope.currentTitle = '-1'; $data = {

我只是在我的angular应用程序中设置路线。第一个视图,
List
进行http调用以获取演示文稿列表

function ListController($scope, $http)
{
    $scope.error            = null;
    $scope.presentations    = null;
    $scope.requesting       = true;
    $scope.currentTitle     = '-1';
    $data = {
        'type' : 'presentations'
    };

    $http.post('resources/request.php', $data, {timeout:20000})
        .success(function(data, status, headers, config)
        {
            $scope.requesting   = false;
            $scope.presentations    = data;
        })
        .error(function(data, status, headers, config)
        {
            $scope.requesting   = false;
            log(status + ', data:" ' + data + '"');
        }
      }
    );
}
我的路线是

angular.module('main',[]).
  config(function($routeProvider) {
    $routeProvider.
      when('/', {controller:ListController, templateUrl:'resources/views/list.html'}).
      when('/view/:id', {controller:VforumController, templateUrl:'resources/views/vforum.html'}).
      otherwise({redirectTo:'/'});
  });
我遇到的问题是,当我转到
#/view/:id
,然后返回
/
时,
$http
调用再次被调用。我如何使它只在第一次进入应用程序时加载,并引用第一次加载的相同数据


我试图在angular之外创建一个变量,并将其设置为第一次加载的数据。然后,在
ListController
中,基本上执行了
操作,如果数据为null,则执行$http调用,否则设置$scope.data=data
,但这不起作用。列表视图是空的<代码>$scope.data是构建我的列表的工具。

您需要的是一个服务,在angular中是一个单例:

.factory('myDataService',函数($http){
var承诺;
返回函数($data){
如果(!角度定义(承诺)){
promise=$http.post('resources/request.php',$data,{timeout:20000});
}
回报承诺;
}
});
现在,您只需将对
$http
的调用替换为对您的服务的调用:

函数ListController($scope,myDataService)
{
// ...
myDataService($data).然后(函数成功(响应){
$scope.requising=false;
$scope.presentations=response.data;
},函数错误(响应){
$scope.requising=false;
日志(状态+,数据:“+response.data+”);
});
}

您想要的是一个服务,在angular中是一个单例:

.factory('myDataService',函数($http){
var承诺;
返回函数($data){
如果(!角度定义(承诺)){
promise=$http.post('resources/request.php',$data,{timeout:20000});
}
回报承诺;
}
});
现在,您只需将对
$http
的调用替换为对您的服务的调用:

函数ListController($scope,myDataService)
{
// ...
myDataService($data).然后(函数成功(响应){
$scope.requising=false;
$scope.presentations=response.data;
},函数错误(响应){
$scope.requising=false;
日志(状态+,数据:“+response.data+”);
});
}

您是否尝试将
$route
传递到控制器并在
$http.post()
之前检查路由?值得一试。我以前从未使用过
$routeParams
。嗯,
$routes
。这是我第一次。我会调查一下的,谢谢您是否尝试将
$route
传递给控制器并在
$http.post()
之前检查?值得一试。我以前从未使用过
$routeParams
。嗯,
$routes
。这是我第一次。我会调查的,谢谢。我认为我做得不对。我正在获取未定义的
$data
。再说一遍,以前没有使用过工厂/服务:这里出了什么问题?如何将
$data
传递给服务?这取决于它是否是静态的。因为您在这里静态地定义了它,所以您可以将它静态地放置在服务中。如果您希望它是动态的,那么您的工厂可以返回一个函数。我将更新后一种情况的答案。太棒了,成功了!
var promise
服务正在检查什么?我不确定是什么原因导致应用程序不会调用$http调用两次。换句话说,
promise
是否包含我加载的数据?否,
promise
是一个。:-)promise提供了用于处理异步生成的数据的API
$http
返回一个,我们在第一次调用从服务返回的函数时存储它。随后的每一次,
promise
都已经定义,所以我们只返回现有的一个。承诺链的内部是您的数据;您必须始终从
然后
块中访问数据,因为您的代码不知道数据是否已加载。不管是7毫秒还是7秒都无关紧要,你不需要解释。好吧,我现在明白了。这太棒了。我越来越喜欢使用它,谢谢!我认为我做得不对。我正在获取未定义的
$data
。再说一遍,以前没有使用过工厂/服务:这里出了什么问题?如何将
$data
传递给服务?这取决于它是否是静态的。因为您在这里静态地定义了它,所以您可以将它静态地放置在服务中。如果您希望它是动态的,那么您的工厂可以返回一个函数。我将更新后一种情况的答案。太棒了,成功了!
var promise
服务正在检查什么?我不确定是什么原因导致应用程序不会调用$http调用两次。换句话说,
promise
是否包含我加载的数据?否,
promise
是一个。:-)promise提供了用于处理异步生成的数据的API
$http
返回一个,我们在第一次调用从服务返回的函数时存储它。随后的每一次,
promise
都已经定义,所以我们只返回现有的一个。承诺链的内部是您的数据;您必须始终从
然后
块中访问数据,因为您的代码不知道数据是否已加载。不管是7毫秒还是7秒都无关紧要,你不需要解释。好吧,我现在明白了。这太棒了。我越来越喜欢使用它,谢谢!