2013-03-22 3 views
0

Я просто настраиваю маршруты в своем угловом приложении. Первый взгляд, 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 вызова снова вызывается. Как я могу сделать это, чтобы он загружал только первый раз в приложение и ссылался на те же самые данные, которые были загружены в первый раз?

Я попытался создать переменную за пределами угловой и установить ее равной загруженным в первый раз. Затем в ListController в основном делал if data is null, do the $http call else set $scope.data = data, но это не сработало. Список был просто пустым. $scope.data - это то, что строит мой список.

+0

ли Вы, попробуйте передать '$ route' на ваш контроллер и проверите [' $ routeParams'] (http://docs.angularjs.org/api/ng.$routeParams) перед '$ http.post()'? Стоит сделать снимок. – couzzi

+0

Я никогда не использовал '$ routeParams' раньше ... ну,' $ routes' вообще. Это мой первый раз. Я рассмотрю это, спасибо – Ronnie

ответ

4

То, что вы хотите, это услуга, которая в угловом одноэлементно:

.factory('myDataService', function ($http) { 
    var promise; 

    return function ($data) { 
    if (! angular.isDefined(promise)) { 
     promise = $http.post('resources/request.php', $data, {timeout:20000}); 
    } 

    return promise; 
    } 
}); 

И теперь вы можете просто заменить вызов $http с призывом к вашим услугам:

function ListController($scope, myDataService) 
{ 
    // ... 

    myDataService($data).then(function success(response) { 
    $scope.requesting = false; 
    $scope.presentations = response.data; 
    }, function error(response) { 
    $scope.requesting = false; 
    log(status + ', data:" ' + response.data + '"'); 
    }); 
} 
+0

Я не думаю, что я делаю это правильно. Я получаю '$ data' не определен. Опять же, не использовали заводы/службы раньше: http://pastie.org/7084834 что здесь не так? Как передать '$ data' в службу? – Ronnie

+0

Это зависит от того, является ли он статичным. Поскольку вы определили его статически здесь, вы можете просто статически ставить его в службу. Если вы хотите, чтобы он был динамическим, ваша фабрика может вернуть функцию вместо этого. Я обновлю ответ на последний случай. –

+0

Удивительный, это сработало! Является ли 'var prom' проверкой службы? Я не уверен, что это делает, поэтому приложение не вызывает вызов $ http дважды. Другими словами, содержит ли «обещание» мои загруженные данные? – Ronnie