2012-06-28 4 views
1

Коллекция знает свои модели, но есть ли способ для модели добраться до ее коллекции?Должна ли модель знать свою коллекцию?

Мне нужен способ добраться до «смежных» моделей в коллекции. Следующее может дать лучшее представление о проблеме:

Я пытаюсь реализовать простое приложение, которое оценивает элементы на основе атрибута «приоритет» в модели и поддерживает их список. В каждом представлении модели есть кнопки для увеличения или уменьшения приоритета, что должно соответствующим образом изменять порядок списка. Простое добавление или вычитание одного из текущего значения будет работать до тех пор, как приоритетные-атрибуты являются непрерывными, например:

1,2,3,4,5,6 

Но есть также кнопка удаления, которая позволяет удалить любую модель из списка. Это может привести к приоритетным-атрибутам, такие как:

1,2,5,6 

Теперь изменение приоритета 5 до 4 обыкновения изменять порядок списка, как это по-прежнему больше, чем 2.

+0

Предполагается, что коллекция должна быть переупорядочена на основе приоритета? – reach4thelasers

ответ

4

Это документировано, но модели автоматически имеют свойство collection, которое указывает на коллекцию. Я не знаю подробностей о том, как это работает, если модель находится в нескольких коллекциях (возможно, свойство collection не изменяется после его установки).

Чтобы решить конкретную проблему, о которой вы упомянули, вы можете прослушать remove событий в коллекции и отрегулировать их соответствующим образом. В этом случае вам даже не нужно, чтобы это свойство collection, потому что и модель, и коллекция будут переданы слушателю remove.

var handler = function (model, collection, options) { 

    // ... 

}; 

collection.on('remove', handler); 

Backbone.Collection docs также сказать:

индекс, при котором модель удаляется из коллекции доступен как options.index

options аргумент remove слушателей не документировано где подпись для remove слушателей - documented, но она передается (в 0.9.2 в любом случае).

+0

Полезно знать это, тем временем я понял, что просто прослушивание событий изменений решает всю проблему: я могу найти смежные модели в слушателе. – wannabeartist

+1

Да, я изначально собирался что-то сказать об этом, но потом это звучало так, будто у вас была проблема с частью удаления. Если вы слушаете «change: priority» в коллекции, вы получите модель в качестве первого аргумента и можете получить доступ к коллекции через 'model.collection', или если вы не хотите полагаться на это, вы можете зарегистрировать listener как 'collection.on ('change: priority', handler, collection)', а затем получить доступ к коллекции как 'this' в слушателе. – JMM

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