Подтвердить что ты не робот

Ember.js: Перезагрузка отношений .hasMany, передаваемых через "ссылки" в полезной нагрузке

Скажем, у меня две модели, Topic и Post:

App.Topic = DS.Model.extend({
  posts: DS.hasMany('post', { async: true, inverse: 'post' });
});

App.Post = DS.Model.extend({
  topic: DS.belongsTo('topic', { async: true });
});

Тема hasMany Сообщения и сообщение belongsTo a Тема.

Чтобы загрузить данные из API, выполняется один начальный вызов (который выбирает тему... topic ID 2, например): GET /topics/2

После получения полезной нагрузки для этого запроса GET, сериализатор затем добавляет ключ links к полезной нагрузке. У этого есть путь для загрузки сообщений, связанных с темой:

"topic": {
   "id": 2,
   "links": {
      "posts": "/topics/2/posts"
   }
}

Этот второй запрос (до /topics/2/posts) - это то, как сообщения загружаются и присоединяются к теме.

Все это отлично работает при первой загрузке страницы.

Проблема возникает, когда Post создается во время сеанса страницы. Хотя я могу заставить эту тему перезагружать (вызывая .reload() для объекта модели, который представляет тему), Posts, связанный с темой, перезагружается not. Второй вызов API (для получения сообщений) никогда не выполняется, в то время как первый вызов (чтобы получить только тему) сделан. Если я обновляю страницу, будут загружены сообщения, созданные мной на предыдущей загрузке страницы (но, конечно, если я перейду и сделаю еще несколько сообщений, они не появятся до загрузки следующей страницы).

В поисках решения я столкнулся с этим вопросом: Как перезагрузить асинхронную связь с ссылками hasMany?

Однако, похоже, что решение больше не работает для текущих версий Ember/Ember-Data. Предоставленный JSFiddle не работает.

Итак, , как я могу перезагрузить этот вид hasMany-отношений? Приветствуется любая помощь.

4b9b3361

Ответ 1

Итак, есть проблема с GitHub, которая еще не закрыта (на сегодняшний день): https://github.com/emberjs/data/issues/1913

Я не знаю, как сделать его перезагрузкой, но я подумал, что поделюсь обходным решением, которое я сделал для решения этой проблемы.

Я использую websockets, поэтому когда когда-либо создается новое сообщение, я просто отправляю его через websocket и использую данные для обновления коллекции.

Я знаю, что это не устраняет проблему с Ember Reload, но я думаю, что это достойное решение для людей, которые уже используют Websockets/Socket.io.

Ответ 2

DS.Model.reopen({
  reloadLink: function (linkKey) {
    if ($.isArray(linkKey)) {
      var promises = [];
      for (var i = 0; i < linkKey.length; i++) {
        promises.push(this.reloadLink(linkKey[i]));
      }
      return Em.RSVP.all(promises);
    } else {
      var rel = this._relationships[linkKey];
      if (rel) {
        if (rel.reload) {
          return rel.reload();
        } else if (rel.fetchLink) {
          return rel.fetchLink();
        }
      }
    }
  }
});

Пример:

model: function () {
    var model = this.modelFor('_some_model_');
    return model.reloadLink(['link1', 'link2']).then(function () {
      return model;
    });
}