2012-04-05 9 views
4

Я пытаюсь использовать 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') 
+0

Да, JS Вы отправили очень не-правильно. Можете ли вы опубликовать оригинал coffeescript? –

ответ

10

Краткий ответ

У вас просто нет доступа к значению обратного отношения в методе инициализации службы.

Значение обратной связи устанавливается после завершения инициализации.

Longer Ответ

Предполагая, что это 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) 

До тех пор пока в коллекции Search.services не будут добавлены сервисные модели service1 и service2, будут установлены обратные отношения для сервисов1.search и service2.search.

Вот JS скрипку, которая показывает порядок выполнения операций в консоли: http://jsfiddle.net/MNh7N/6/

+0

Идеальный ответ. Благодарю. –

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

  • Нет связанных вопросов^_^