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

Ember - Понимание обратных отношений

Прочитав руководство Начало работы на странице Ember, я все еще немного смущен, что такое обратная связь, и когда их определять. Я понимаю, что вам, вероятно, придется использовать их при определении нескольких отношений одного типа, но я нашел пример очень неясным. Это образец из документов:

var belongsTo = DS.belongsTo,
    hasMany = DS.hasMany;

App.Comment = DS.Model.extend({
  onePost: belongsTo('post'),
  twoPost: belongsTo('post'),
  redPost: belongsTo('post'),
  bluePost: belongsTo('post')
});


App.Post = DS.Model.extend({
  comments: hasMany('comment', {
    inverse: 'redPost'
  })
});

В этом примере почему redPost выделяется как обратный вместо одного из других видов сообщений? Как определение redPost как обратного дифференцирует его от остальных? Я также не понимаю, почему комментарий имеет несколько сообщений вообще, просто добавляя к моей путанице.

4b9b3361

Ответ 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' })
});

Это более реальный пример. Каждый пост может иметь любое количество комментариев, в то время как комментарий должен принадлежать ровно одному сообщению. Имеет смысл. Как вы можете видеть, эти обратные ссылки относятся друг к другу. Но что такое обратное? Обратное отношение просто описывает то, что ребро между двумя узлами вызывается с другой стороны. Например, посмотрите на это изображение:

enter image description here

Вы увидите два узла с одним краем между ними. С точки зрения объекта 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 нуждается в обратной зависимости: поэтому он может поддерживать целостность, не беспокоясь об этом.