2015-07-21 5 views
2

У меня есть CollectionView, который генерирует этот вид спискаBackbone - добавление записи в коллекции (внутри коллекции)

<ul> 
    <li> All </li> 
    <li> Option 2</li> 
    <li> Option 2<li> 
<ul> 

Вся информация о второй и третьей позиции в этом списке выбирается из DB. Но я бы хотел иметь вариант «Все». И я хотел бы, чтобы этот вариант был на первой позиции в моей коллекции.

Единственное, что мне пришло в голову, это перезаписать метод MyCollection add(). Он работает очень хорошо, но я просто проверяю, нет ли лучшего/более простого способа сделать это.

MyCollection:.

define([ 'underscore', 'backbone', 'models/MyModel'], function(_, Backbone, MyModel){ 
    var MyCollection = Backbone.Collection.extend({ 
    model: MyModel, 

    initialize: function(opts) { 
     this.options = opts; 
     this.add({name: "All", icon_class="all"}) /// this doesn't work 
    }, 

    add: function(models, options) { 
     models.unshift({name:"All", icon_class:"all"}) 
     return this.set(models, _.extend({merge: false}, this.options)); 
    }, 
    }); 

    return MyCollection; 
}); 

(На стороне записки, коллекция сама по себе не извлечение данных из БД выборки на самом деле называется образуют (давайте называть его) ModelX, распределяющая данные в другую коллекцию, которые также используют то же данные. Так как только ModelX отделок, забирающих все данные, он передает данные все необходимые представления.)

+1

я бы, скорее всего, вид добавить, что первый элемент во время рендеринга и держать его из коллекции целиком. – ivarni

+0

, так что я считаю, что не стоит добавлять его из коллекции, верно? – Alexus

+1

Это мое мнение по крайней мере. Это не так много, что вы добавляете его из коллекции, но добавляете его в коллекцию вообще. Это означает, что ваша коллекция больше не представляет фактические данные с сервера и может вернуться и преследовать вас позже. – ivarni

ответ

2

Я решение такого про на уровне шаблонов. Поскольку этот элемент на самом деле не в вашей коллекции, я бы не стал его подделывать:

<ul> 
    <li>All</li> 
    <% _.each(item, function (i) { %> 
    <li><%- i.name%></li> 
    <% }); %> 
</ul> 
+0

Да, это сработало бы, если бы список не был полностью сгенерирован Marionete 'CollectionView'. Мне нужно предоставить« CollectionView »объект colection и шаблон, который будет применяться к каждой записи моего списка. – Alexus

+0

Тогда я бы добавил его прямо перед рендерингом, чтобы моя коллекция была идентична данным сервера, насколько я могу. Я не использовал Marionette, но печально, когда библиотека препятствует реализации KISS-решений. –

+0

Использовать Marionette 'CompositeView'? – ivarni

0

Я думаю, что у вас есть правильная идея. Поскольку у вас есть отдельные модели для представления постоянных данных на сервере, данные этой коллекции явно предназначены для представления данных представления, и поэтому вполне можно положить Все в коллекцию.

Вы можете сделать это из коллекции или с внешнего «контроллера», в зависимости от вашей архитектуры. Кажется, вы хотите сделать первое.

Ваш add взлома довольно уродливый. Было бы намного проще переопределить конструктор. (См here, почему это делать с initialize не работает.)

var MyCollection = Backbone.Collection.extend({ 
    model: MyModel, 

    constructor: function(models, options) { 
     if (!models) models = []; 

     models.unshift({name:"All", icon_class:"all"}); 
     Backbone.Collection.prototype.constructor.call(this, models, options); 
    }, 
} 
Смежные вопросы