2013-03-06 4 views
4

Я предположил, что если модель в данных ember содержит идентификатор, относящийся ко второй модели, тогда идентификатор также может быть использован для установления отношения toTrade к второй модели объект, в соответствии с выпуском, который я создал here on github. По-видимому, это не так.Как связаны отношения между связанными моделями в данных ember-данных

Кто-нибудь знает обстоятельства, которые необходимы для установления отношений между двумя объектами, которые существуют в хранилище данных ember-данных, связаны друг с другом? Нужно ли загружать связанные объекты одновременно? (или пройти по той же просьбе в случае RESTAdapter), чтобы ссылки на идентификаторы работали? В случае, если они не пройдут по одному и тому же запросу, есть ли способ установить отношения для последующих запросов без необходимости добавлять обработчики событий для запросов, которые ищут отношения и устанавливают их вручную? Вот пример вопроса я вижу:

App.ModelA = DS.Model.extend({ 
    name:  DS.attr('string'), 
    modelBId: DS.attr('number'), 
    modelB: DS.belongsTo('App.ModelB') 
}); 

App.ModelB = DS.Model.extend({ 
    name: DS.attr('string') 
}); 

App.ModelB.find(2);  // returns an object 

modelA.get('modelBId'); // returns 2 
modelA.get('modelB');  // returns null 

ответ

1

Идентификатор связанных объектов полезны, когда вы хотите загрузить/сохранить данные, из REST API, например. Затем вы можете использовать RESTAdapter и отправить идентификатор связанных объектов.

Например, для связи belongsTo данные ember предполагают, что вы отправите ключ model_b_id с идентификатором связанного объекта. Тогда данные ember будут обрабатывать загрузку этого объекта, как правило, путем вызова API: GET model_b/the_id

Также возможно загрузить связанные объекты, вставив их вместо указания ссылки по идентификатору.

Более подробно см. Другие вопросы по StackOverflow и пример/тест в проектах с данными ember-data.

+0

Вещь, которую я до сих пор не понимаю, заключается в том, что API отправляет model_b_id вместе с вызовом modelA api. Тем не менее, все объекты modelB ранее были загружены с использованием вызова 'ModelB.find()', поэтому другой вызов API для получения данных modelB, связанных с modelA, не требуется, и не загружает данные (и для этих данных я не Не хотите, чтобы нагрузка на него вызывалась, вызовы ModelA.find() часто бывают в приложении, но ModelB похож на таблицу поиска с ограниченным количеством редко изменяющихся значений). Итак, данные ember-данных, не обнаруживающие связанные объекты B, данные b/c не загружаются? – Adam

+0

Если связанный объект уже загружен, как вы сказали, модель, ember-data не запускает запрос ajax, а берет его с карты идентификации. Отвечает ли он на ваш вопрос? –

+0

Спасибо, что присоединились ко мне на этом на Адриене, я очень ценю это. Я чувствую, что ты близок к тому, чтобы помочь мне решить мою путаницу. Что такое идентификационная карта? Googling заставляет меня думать, что это может быть то же самое, что и я, как магазин (вид в браузере памяти db). Если бы это было так, я бы подумал, что последний 'modelA.get ('modelB')' будет возвращать объект modelB, связанный с model_b_id 2. Так как это не так, возможно, идентификационная карта - это что-то еще. Как я могу сделать modelB с ID 2, который уже существует, связан с modelA с modelBId из 2 через карту идентификации? – Adam

1

Адам,

Я начинаю с Ember данными себя и путаница, как правило, из-за его много автоматики/предположения REST API. попробуйте:

App.ModelA = DS.Model.extend({ 
    name:  DS.attr('string'), 
    modelB: DS.belongsTo('App.ModelB') 
}); 

Если REST API возвращает Model A, как:

{"model_a":{"name": "Adam", "model_b_id": 2}} 

Эффективно и по умолчанию Ember данных '_id' Гвозди, для любых отношений belongsTo, на имя decamelized атрибута, или ' _ids 'для любого hasMany.

+0

Спасибо, Колин, я ценю ответ. В этом случае мой API возвращает ключ для «model_b_id», связанный с «model_a» (каким образом устанавливается свойство modelBId на экземпляре modelA), поэтому я думаю, что может произойти что-то еще. Действительно хороший отзыв, хотя, спасибо за прыжки. Мне все еще нужно обработать jsFiddle, показывая, что это происходит. – Adam

Смежные вопросы