Тонкая настройка обновления нескольких моделей в маршруте Ember

Существует хорошо известный подход к поддержке загрузки более одного промиса модели в роуте Ember с использованием Ember.RSVP.hash:

// app/routes/posts.js

export default Ember.Route.extend({

  model(params) {
    return Ember.RSVP.hash({
      posts: this.store.findAll('post', params),
      tags: this.store.findAll('tag', params),
    });
  },

});

Теперь у меня есть параметр page, чтобы иметь возможность загружать сообщения партиями, вместо того, чтобы загружать их и показывать все сразу. Но изменения страницы не изменяют теги. Однако, когда параметр страницы изменяется, вся модель маршрута снова запускается для повторной загрузки, в результате чего приложение повторно извлекает как сообщения для новой страницы, так и одни и те же теги снова и снова.

Есть ли способ настроить это так, чтобы теги не загружались при изменении определенных параметров?


person Ernesto    schedule 31.01.2017    source источник


Ответы (1)


Существует несколько способов рефакторинга вашего кода. Как перемещение тегов из модели. Или делать нумерацию страниц по-другому (без обновления модели). Мне нравится писать собственную утилиту getAll.

var cache = {}; // model_name => Promise<[Record]>

function getAll(store, model) {
    if(!store.modelFor(model).cacheable) {
        return store.findAll(model);
    }

    if(!cache[model]) {
        cache[model] = store.findAll(model);
    }

    return cache[model];
}

И в вашей модели сейчас

import { getAll } from 'utils/store';
...
tags: getAll('tag'),
person kris    schedule 31.01.2017
comment
Дело в том, что в реальном сценарии, с которым я столкнулся (конечно, это не пример сообщений и тегов), одна из подмоделей, извлеченных в Ember.RSVP.hash, зависит от некоторых, но не всех параметров маршрута, которые изменились. Другой зависит от изменения любого параметра. Так что мне все еще нужен хук модели params для получения второй подмодели. Я просто не хочу, чтобы он был повторно выбран, когда измененный параметр не влияет на его результат. - person Ernesto; 31.01.2017
comment
Что ж, вы можете изменить приведенный выше пример в соответствии с вашими потребностями, добавив дополнительный аргумент в свойства кеша (параметры). Если параметр тот же и имя модели такое же, тогда возьмите из кеша, иначе загрузите новый. - person kris; 31.01.2017
comment
@ Эрнесто, какой успех? - person kris; 02.02.2017
comment
Я закончил тем, что не использовал никакого решения для кэширования, вы знаете, из-за этой мантры, которая гласит, что в компьютерных науках есть только две сложные вещи: инвалидация кэша и присвоение имен. В итоге я извлек вторую подмодель, которая не всегда меняется, и поместил ее в компонент, который является единственным местом на странице, где используется эта дополнительная модель. Компонент уведомляется об изменении соответствующих параметров и обновляет данные. - person Ernesto; 03.02.2017