Событие перехвата BackboneJS OnAdd при начальной загрузке

Я создаю коллекцию без использования fectch(), но с уже доступными данными JSON.

this.displays = new Displays(jQuery.parseJSON($('#temp_json').html()));

Мне нужно, чтобы каждая модель этой коллекции имела настройку значения «позиция», которая должна быть позицией этой модели в этой коллекции.

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

Затем я сделаю что-то вроде:

theModel.set('position', this.length);

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

Это может показаться странным, но я должен сделать это, так как позже, на мой взгляд, я буду выполнять такие вещи, как:

var prototypeNames = [this.model.get('display').get('position'), this.model.get('position')];

Надеюсь, это достаточно ясно. Спасибо!


person LEM01    schedule 13.07.2012    source источник


Ответы (3)


Collection.add-функция запускает add-событие, которое вы можете прослушать с помощью on-функции. Событие передает добавленную модель И объект параметров, который содержит некоторые полезные атрибуты (например, индекс, по которому была добавлена ​​модель), в качестве параметров. (документация здесь)

Итак, вы сделаете что-то вроде этого:

collection.on('add', function(model, options) {
  model.set('position', options.index); 
});

если вы хотите узнать больше о параметрах, которые передает add-событие, просто запишите их, потому что существующая документация в лучшем случае скудна.

collection.on('add', function(model, options) {
  console.log(options); 
});

Надеюсь это поможет!

person jakee    schedule 13.07.2012
comment
Если я не ошибаюсь, это событие не срабатывает при построении коллекции, если она содержит несколько элементов. Итак, onLoad не срабатывает, что мне и нужно. - person LEM01; 02.08.2012

Решение, которое сработало для меня:

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

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

window.Displays  = Backbone.Collection.extend({
    model: Display,
    initialize: function(data, options){
        this.on("relational:add", function(relModel){
            relModel.set('pos',this.indexOf(relModel));
            this.trigger('postAdd', relModel);
        }, this);
    },

});
person LEM01    schedule 02.08.2012

Вы можете переопределить реализацию коллекции по умолчанию «добавить», чтобы вызвать пользовательское событие, которое не будет отключено Backbone.

var MyCollection = Backbone.Collection.extend({

  // Override the default 'add' implementation...
  add: function( models, options ) {

    // Call the default implementation first...
    Backbone.Collection.prototype.add.apply( this, arguments );

    // Fire our custom events on the models...
    while (model = models.shift()) {
      model.trigger('customAdd', model, this, options);
    }

    return this;
  }

});

Теперь вы можете прослушивать событие customAdd, инициированное в модели. Это всегда будет срабатывать, событие, когда молчание = true.

Как следствие, при добавлении элемента с {silent: false} будут запущены два события: «добавить» и «customAdd».

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

person toon.ketels    schedule 08.01.2013