Backbone Relational: событие удаления не запущено

Я пытаюсь настроить небольшую пару моделей с помощью Backbone Relational, но я не понимаю, как запускается событие удаления.

Вот код моей модели:

var Car = Backbone.RelationalModel.extend({
    idAttribute: "id"
});

var Cars = Backbone.Collection.extend({
    model: Car
});

var CarCollection = new Cars();

var User = Backbone.RelationalModel.extend({

    idAttribute: 'id',
    relations: [{
        type: Backbone.HasMany,
        key: 'model',
        relatedModel: Car,
        collectionType: Cars,
        includeInJSON: 'model',
        reverseRelation: {
            key: 'ownedBy',
            includeinJSON: 'name'
        }
    }]

  });

var Users = Backbone.Collection.extend({
    model: User
});

var UserCollection = new Users();

//Bootstrap data and put it in the collections

var carsData = [
    {id:1, model:'500',ownedBy:1},
    {id:2, model:'Corsa',ownedBy:2},
    {id:3, model:'Civic',ownedBy:2}
];

var usersData = [
    {id:1,name:'Dude'},
    {id:2,name:'Mark'}
];

CarCollection.add(carsData);
UserCollection.add(usersData);

Что я получаю в JSON, так это:

UserCollection = {"id":1,"name":"Dude","model":["500"]}{"id":2,"name":"Mark","model":["Corsa","Civic"]}

CarCollection = {"id":1,"model":"500","ownedBy":"Dude"}{"id":2,"model":"Corsa","ownedBy":"Mark"}{"id":3,"model":"Civic","ownedBy":"Mark"}

Теперь, если я добавлю элемент в CarCollection следующим образом:

CarCollection.add({id:4,model:'Prius',ownedBy:1};);

Событие «добавить» запускается, но если я удалю один элемент из коллекции:

var el = CarCollection.get(1);
CarCollection.remove(el);

Ни одно событие не запускается.

Я решил это с помощью обходного пути, например:

var el = CarCollection.get(1);
el.destroy();

или отмените регистрацию непосредственно в Backbone.store:

Backbone.Relational.store.unregister(el);

или просто установить для свойства ownedBy значение null:

var el = CarCollection.get(1);
el.set("ownedBy",null);

Это правильное поведение плагина? Или я неправильно настроил свои модели? Спасибо за каждый ответ.


person Ingro    schedule 18.12.2012    source источник


Ответы (1)


Вы должны передать модель remove, а не индекс

Collection.remove(model)

Вы можете сделать следующее:

CarCollection.remove(CarCollection.at(0));

удалить модель с индексом 0 или...

CarCollection.remove(CarCollection.get(4));

удалить модель с id 4

person Ingemar    schedule 18.12.2012
comment
Извините, я поместил неправильный пример в свой код, я обновил его сейчас. Я уже пробовал так, как вы предлагаете. Если я зарегистрирую CarCollection после удаления, он содержит всего 2 элемента (правильно), но UserCollection не обновляется, и событие удаления: модель не запускается: \ - person Ingro; 18.12.2012
comment
Я не знаю, полный ли это ваш код, но в вашем примере вы не привязали CarCollection к пользователю. Я думаю, что у вашего RelationalModel, также известного как User, есть собственный экземпляр Cars (который остается пустым). Кстати. Я не использовал Backbone.RelationalModel, так что это всего лишь предположение. - person Ingemar; 18.12.2012
comment
Об этом должен позаботиться reverseRelation в User RelationalModel. На самом деле CarCollection.add() запустить связанное событие. Другой способ, который я нашел для запуска события удаления, просто устанавливает значение null для значения ownedBy элемента внутри CarCollection. Может быть, это просто правильное поведение, но я не могу найти ничего, чтобы подтвердить это в Документах. Спасибо в любом случае за вашу помощь! - person Ingro; 18.12.2012