Backbone Relational неправильно устанавливает обратные отношения?
Я пытаюсь использовать Backbone.Relational для настройки некоторых ассоциаций в моем приложении.
В основном у меня есть позвоночник Search
а также Service
моделей. Поиск имеет ServiceList
Коллекция, которая содержит много услуг.
Однако я не могу получить доступ к родительскому поиску из инициализатора службы. Когда я пытаюсь войти в родительский поиск, я получаю null
, Кто-нибудь может увидеть, что я делаю не так?
Моя поисковая модель настроена так (код может содержать синтаксические ошибки, я на лету перевожу coffeescript):
var Search = new Backbone.RelationalModel({
urlRoot: '/searches',
relations: [{
type: Backbone.HasMany,
key: 'services',
relatedModel: 'Service',
collectionType: 'ServiceList',
reverseRelation: {
key: 'search'
}
}],
initialize: function(options) {
// => Search "has services:", ServiceList
console.log this, "has services:", @get('services');
}
});
var Service = new Backbone.RelationalModel
initialize: function() {
// => Service "in" null
console.log this, "in", @get('search');
}
});
Или, если вы предпочитаете CoffeeScript:
class Search extends Backbone.RelationalModel
urlRoot: '/searches'
relations: [
type: Backbone.HasMany
key: 'services'
relatedModel: 'Service'
collectionType: 'ServiceList'
reverseRelation:
key: 'search'
]
initialize: (options) ->
// => Search "has services:", ServiceList
console.log this, "has services:", @get('services')
class Service extends Backbone.RelationalModel
initialize: ->
// => Service "in" null
console.log this, "in", @get('search')
1 ответ
Короткий ответ
У вас просто нет доступа к значению обратной связи в методе инициализации Сервиса.
Значение для обратной связи устанавливается после завершения инициализации.
Более длинный ответ
Предполагая этот JavaScript:
Search = Backbone.RelationalModel.extend({
urlRoot: '/searches',
relations: [{
type: Backbone.HasMany,
key: 'services',
relatedModel: 'Service',
reverseRelation: {
key: 'search'
}
}],
initialize: function(options) {
console.log(this, "has services:", this.get('services'));
}
});
Service = Backbone.RelationalModel.extend({
initialize: function() {
console.log(this, "in", this.get('search'));
}
});
При создании новой модели поиска со связанными сервисами:
s1 = new Search({name:"Some Search",services:[{name:"service1"},{name:"service2"}]});
Что произойдет, это:
new Service model created (for service1) - name set to "service1"
(but, since what got passed to the model for properties is {name:"service1"}
you can see how this model cannot know its reverse relation yet.)
new Service model created (for service2) - name set to "service2"
(same as above)
new Search model created (for 'some search')
name set to 'some search'
service1 Service model added to Search.services
(triggers 'update:search' event on Service1 model)
service2 Service model added to Search services
(triggers 'update:search' event on Service2 model)
Лишь в тех случаях, когда модели Service1 и Service2 Service добавляются в коллекцию Search.services, устанавливаются обратные отношения для service1.search и service2.search.
Вот скрипта JS, которая показывает порядок операций в консоли: http://jsfiddle.net/MNh7N/6/