Маршрутният модел на EmberJS изпраща api повикване всеки път, когато се поиска маршрут

Имам маршрут, който изисква да заредя набор от модели чрез api извиквания. Работи добре, но всеки път, когато отида на друг маршрут и след това се върна към маршрута, Ember задейства друг набор от gets. Как мога да кеширам резултата при първото зареждане на маршрут? Кодът е достъпен тук: https://github.com/knusul/embercv/blob/master/app/assets/javascripts/routes/index_route.coffee

App.IndexRoute = Ember.Route.extend
  model: (param)->
    return Em.RSVP.hash(
      card: @store.find('card', 'singleton')
      experiences: @store.find('experience')
      educations: @store.find('education')
      skills: @store.find('skill')
      languages: @store.find('language')
      hobbies: @store.find('hobby')
    ).then (hash) ->
      return Em.RSVP.hash(hash)

  setupController: (controller, model)->
    if App.currentUser
      @controllerFor('card').set 'model', model.card
      @controllerFor('experiences').set 'model', model.experiences
      @controllerFor('educations').set 'model', model.educations
      @controllerFor('skills').set 'model', model.skills
      @controllerFor('languages').set 'model', model.languages

person Jakub Nieznalski    schedule 24.11.2013    source източник


Отговори (2)


Изглежда, че извиквате #find без конкретен идентификатор, т.е. вие питате за findAll. findAll ще удари вашия адаптер, поради което винаги изпраща Ajax повикване.

Разглеждане на документацията на магазина на Ember Data:

Методът find винаги ще връща обещание, което ще бъде разрешено със записа. Ако записът вече е бил в магазина, обещанието ще бъде разрешено незабавно. В противен случай магазинът ще поиска find метода на адаптера, за да намери необходимите данни.

Така че може да помислите за рефакторинг на кода си, за да направите една заявка #find за конкретен идентификатор на запис.

person monocle    schedule 24.11.2013

Когато извършите поне едно find('myModel'), извлечените данни се съхраняват в кеш на записи и могат да бъдат достъпни чрез all('myModel') без нови заявки. Така че можете да актуализирате кода си до следното:

App.ApplicationRoute = Ember.Route.extend
  # the model method is called once, when app start
  model: (param)->
    return Em.RSVP.hash(
      card: @store.find('card', 'singleton')
      experiences: @store.find('experience')
      educations: @store.find('education')
      skills: @store.find('skill')
      languages: @store.find('language')
      hobbies: @store.find('hobby')
    ).then (hash) ->
      return Em.RSVP.hash(hash)

App.IndexRoute = Ember.Route.extend
  # because we already loaded all data in application route
  # just use all to access the record cache without new ajax requests
  model: (param)->
    return Em.RSVP.hash(
      card: @store.all('card', 'singleton')
      experiences: @store.all('experience')
      educations: @store.all('education')
      skills: @store.all('skill')
      languages: @store.all('language')
      hobbies: @store.all('hobby')
    ).then (hash) ->
      return Em.RSVP.hash(hash)

  setupController: (controller, model)->
    if App.currentUser
      @controllerFor('card').set 'model', model.card
      @controllerFor('experiences').set 'model', model.experiences
      @controllerFor('educations').set 'model', model.educations
      @controllerFor('skills').set 'model', model.skills
      @controllerFor('languages').set 'model', model.languages
person Marcio Junior    schedule 24.11.2013