Поле отношения RelationalModel в NULL после выполнения работы
У меня проблема с WTF, которую я не могу понять. Я объясняю:
У меня есть модель с именем Product:
var Product = Backbone.RelationalModel.extend(
{
urlRoot: Backbone.rootApiUrl + '/products',
defaults: {
id: '',
name: '',
description: '',
current_price: '',
categories: '',
duration: '',
shipping_cost: '',
start_date: '',
user_id: null,
is_buy_it_now: ''
},
relation: [{
type: Backbone.HasOne,
key: 'user_id',
relatedModel: User,
autoFetch: true
}]
});
Мое поле user_id
является внешним ключом для одного пользователя (который также является моделью в магистрали):
var User = Backbone.RelationalModel.extend(
{
urlRoot: Backbone.rootApiUrl + '/users',
defaults: {
id: '',
name: '',
email: '',
firstname: '',
lastname: '',
password: '',
card_nb: '',
cart_total: ''
}
});
Мои отношения выборки отлично работают в каждой отдельной модели. Но когда я ставлю связь между Product.user_id
и моя модель пользователя, происходит ошибка wtf.
Я перепробовал все возможное: все ключи (keySource
, keyDestination
........... со всеми возможными значениями). Я даже установил контрольные точки в Relation Lib, чтобы иметь возможность наблюдать за тем, что произошло... Ничего не сказать. Даже Stackru не знает эту ошибку:P (Или я плохо искал)
Последняя проблема:
- Мой продукт правильно отправлен через API и установлен в Backbone (ОК).
- Поле
user_id
сначала устанавливается в число в ответе API продукта, а затем устанавливается равным NULL значением Relational, а не заменяется объектом User (ПОЧЕМУ?) - Когда я смотрю мой сетевой отладчик, Relational вызывает API для объекта User (здесь все в порядке) с
user_id
номер (ОК). Ответ сервера хороший, с правильным пользователем в формате JSON (ОК). Но Relational не связывает этот объект ответа с полемuser_id
, который сейчас.... NULL (НЕ ОК).- Таким образом, я потерял объект User (но я могу console.log(), если я поместил функцию успеха в autoFetch), неправильно привязанный к его родительскому продукту с полем
user_id
,
- Таким образом, я потерял объект User (но я могу console.log(), если я поместил функцию успеха в autoFetch), неправильно привязанный к его родительскому продукту с полем
РЕДАКТИРОВАТЬ: JSFiddle доступен здесь http://jsfiddle.net/gjdass/WNWrm/ (будьте осторожны, API может долго отвечать, около 10 секунд, это нормально).
Заранее спасибо: / Извините за время, которое вы можете уделить этому.
3 ответа
Он ведет себя иначе, если вы удалите значение по умолчанию user_id
? Интересно, выбирает ли это отношение, а затем применяет значение по умолчанию null
,
Вы также можете попробовать установить Backbone.Relational.showWarnings
в true
если это еще не так, и проверьте вашу консоль на наличие каких-либо предупреждений.
Дайте этому шанс:
relations: [{
type: Backbone.HasOne,
key: 'id',
keyDestination: 'user_id',
includeInJSON: 'user_id',
autoFetch: true,
relatedModel: User
}]
Я не мог сделать головы или хвосты из основной документации. По-видимому key
Предполагается, что он ссылается на идентификатор связанной модели, но, похоже, не делает этого ни в одном из своих примеров. Интересно, работают ли их примеры на самом деле? Во всяком случае, я думаю, что это решает вашу проблему: настройка key
к ключу от связанной модели и настройки keyDestination
а также includeInJSON
поэтому он знает, как установить и сериализовать результат в объект продукта.
Поэтому, если вы внимательно посмотрите на основную реляционную документацию, вы заметите, что ни один из примеров, которые они приводят, не является HasOne с обратной связью HasMany. Таким образом, кажется, что функциональность не проверена (кроме вас!) И не функционирует. Попробуйте отношения по-другому:
var User = Backbone.RelationalModel.extend(
{
urlRoot: 'http://noraj.fr:5000/users',
defaults: {
id: '',
name: '',
email: '',
firstname: '',
lastname: '',
password: '',
card_nb: '',
cart_total: ''
},
relations: [{
type: Backbone.HasMany,
key: 'products',
relatedModel: 'Product',
reverseRelation: {
key: 'id',
keySource: 'user_id',
keyDestination: 'user_id',
includeInJSON: true
}
}]
});
// Product Model
var Product = Backbone.RelationalModel.extend(
{
urlRoot: 'http://noraj.fr:5000/products',
defaults: {
id: '',
name: '',
description: '',
current_price: '',
categories: '',
duration: '',
shipping_cost: '',
start_date: '',
is_buy_it_now: '',
user_id: null
}
});