Ответ 1
Прежде всего, этот пост может немного объяснить ситуацию. Это не ваш точный вопрос, но причины ответа похожи.
Но, чтобы получить четкое представление о том, что такое обратные, вы должны быть знакомы с ориентированными графами. Хотя сразу не видно, ориентированные графики - вот что заслоняет идею belongsTo
и hasMany
.
Но вернемся к специфике. Давайте рассмотрим их пример, исключим некоторые вещи, чтобы сделать его более реалистичным.
App.Post = DS.Model.extend({
comments: DS.hasMany('comment', { inverse: 'post' })
});
App.Comment = DS.Model.extend({
post: DS.belongsTo('post', { inverse: 'comments' })
});
Это более реальный пример. Каждый пост может иметь любое количество комментариев, в то время как комментарий должен принадлежать ровно одному сообщению. Имеет смысл. Как вы можете видеть, эти обратные ссылки относятся друг к другу. Но что такое обратное? Обратное отношение просто описывает то, что ребро между двумя узлами вызывается с другой стороны. Например, посмотрите на это изображение:
Вы увидите два узла с одним краем между ними. С точки зрения объекта Post
ребро называется comments
. Если вы хотите получить node, подключенный этим краем, вы можете вызвать post.get('comments')
. Но с точки зрения объекта Comment
ребро называется Post
. Если вы хотите подключить node к этому краю с помощью объекта Comment
, вам нужно вызвать comment.get('post')
. Это то, что обратное. В нем описывается, как разные объекты ссылаются на одни и те же отношения. Различное имя, тот же край. Явным образом объявляя обратный, вы сообщаете одному объекту, что другой объект вызывает ребро.
Почему это так важно? Ну, Ember-Data должен знать, что он может отвечать взаимностью. Например, скажем, у вас есть следующий код:
var post = store.find('post', '1');
var newComment = store.createRecord('comment', {});
...
post.get('comments').addObject(newComment);
Что вы сделали, так это создать новый комментарий и связать его с существующим объектом post. Простой пример использования. Но есть одна проблема: вы только сказали сообщение о комментарии, а не наоборот. Вы сказали, что сообщение связано с комментарием, но вы не сказали комментарий, что вы подключили его к сообщению. Но, как пользователь, вы ожидаете, что оба они будут происходить одновременно. Ну, так и есть, потому что Ember-Data делает это за вас. Используя имена обратной зависимости, Ember-Data гарантирует, что, когда вы это сделаете, происходит и другое. Когда вы это сделаете:
post.get('comments').addObject(newComment);
Ember-Data, за кулисами, действительно делает это:
post.get('comments').addObject(newComment);
newComment.set('post', post);
Вот почему Ember-Data нуждается в обратной зависимости: поэтому он может поддерживать целостность, не беспокоясь об этом.