2013-07-09 5 views
0

У меня есть SPA со списком клиентов, отображаемым на целевой странице. У каждого клиента есть кнопка редактирования, которая, если щелкнуть, приведет меня к представлению «Редактировать» для выбранного клиента.Сохраняющаяся область по пересеченной местности

Я не уверен, как это сделать - все маршруты, которые я видел до сих пор, просто возьмут мой идентификатор клиента в $ routeParams, а затем большинство примеров вытащит Клиента с фабрики с помощью этого Идентификатора ,

Но у меня уже есть мой клиент ... кажется, отходы ударяют мой веб-сайт api снова, когда у меня его уже есть. Можно ли перейти на новое представление и сохранить выбранный клиент в области $? Edit: Это то, что я did- я не знаю, если это лучше или хуже, чем ответ Clarks ... Я просто сделал следующие угловые услуги:

app.service('clientService', function() { 
    var client = null; 

    this.getClient = function() { 
     return client; 
    }; 

    this.setClient = function (selectedClient) { 
     client = selectedClient; 
    }; 
}); 

И тогда для любого контроллера, который нуждается в том, что данные :

$scope.client = clientService.getClient(); 

Это, казалось, отлично работает ... но хотелось бы услышать, как это хорошо или плохо.

+0

Я думаю, что вы неправильно понимаете маршруты в угловом, они просто на стороне клиента, это не вызывает кругосветное путешествие на ваш сервер, это просто просмотр URL-адреса в браузере, когда это изменяется (используя хэш, чтобы избежать изменения местоположений фактически) угловой анализирует его и загружает шаблон и контроллер и передает по любым параметрам в routeParams новому контроллеру. – shaunhusain

+0

Эта часть, которую я получаю, но контроллер, у которого был мой предыдущий $ scope с выбранным клиентом, теперь исчез. Я думаю, мне нужно использовать сервис, чтобы отслеживать состояние выбора, поскольку он является одиночным. – Nicros

+0

Да, это, в основном, то, как я справляюсь с этим, бросил вместе скрипку, чтобы показать собственно конфигурационный файл маршрута: http://jsfiddle.net/mU266/ В основном, как я обрабатываю это, у меня есть служба, которая делает вызов сервер и сохраняет данные, то я использую routeParams для передачи идентификатора с одного контроллера на другой, служба, которую я написал, имеет метод поиска объектов по id. – shaunhusain

ответ

1

В зависимости от того, какой уровень кэширования вы хотите.

Вы можете зависеть от кеширования браузера, и в этом случае достаточно HTTP-заголовков.

Вы можете зависеть от кеша, предоставленного $ http в угловом выражении, и в этом случае убедиться, что параметры, которые вы отправляете, будут одинаковыми.

Вы также можете создать свою собственную модель кэширования вдоль линий:

module.factory('ClientModel', function($http, $cacheFactory, $q){ 
    var cache = $cacheFactory('ClientModel'); 
    return { 
     get : function(id){ 
      var data = cache.get(id); 
      if(data){ 
       //Using $q.when to keep the method asynchronous even if data is coming from cache 
       return $q.when(data); 
      } else { 
       //Your service logic here: 
       var promise = $http.get('/foo/bar', params).then(function(response){ 
        //Your model logic here 
        var data = response; 
        cache.put(id, data); 
        return response; 
       }, function(response){ 
        cache.remove(id); 
        return response; 
       }); 
       //Store the promise so multiple concurrent calls will only make 1 http request 
       cache.put(id, promise); 
       return promise; 
      } 
     }, 
     clear : function(id){ 
      if(angular.isDefined(id)){ 
       cache.remove(id); 
      } else { 
       cache.removeAll(); 
      } 
     } 
    } 
}); 

module.controller('ControllerA', function(ClientModel){ 
    ClientModel.get(1).then(function(){ 
     //Do what you want here 
    }); 
}); 

module.controller('ControllerB', function(ClientModel){ 
    ClientModel.get(1).then(function(){ 
     //Do what you want here 
    }); 
}); 

Что означало бы каждый раз, когда вы запрашиваете объект клиента с тем же идентификатором «», вы получите тот же объект обратно.

+0

Это делает тонны смысла @Clark Pan, спасибо, что написал это, я очень вероятно исправьте мои услуги, чтобы использовать обещания, как вы здесь показываете. Также не было известно о том, что cacheFactory придется прочитать об этом. – shaunhusain

+0

Спасибо @shaunhusain.Я только недавно решил эту модель после некоторых экспериментов. –

+0

@ClarkPan Мне нравится ваш подход - я добавил код на свой вопрос о том, что я сейчас работаю ... за и против моего подхода? Просто стараюсь учиться ... – Nicros