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-отношений? Приветствуется любая помощь.
Ответы
Ответ 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;
});
}