Можно ли вызвать событие при инициализации модели?

Можно ли в базовой модели инициировать событие в функции инициализации для вложенного представления? Я основал свой текущий код на этом примере: https://stackoverflow.com/a/8523075/2345124 и обновил его. для магистрали 1.0.0. Вот моя функция инициализации для модели:

var Edit = Backbone.Model.extend({
    initialize: function() {
        this.trigger('marquee:add');

        this.on('change', function(){
            this.trigger('marquee:add');
        });
    }
    ...
}

Я пытаюсь вызвать метод renderMarquee при инициализации модели:

var EditRow = Backbone.View.extend({
    initialize: function() {
        this.listenTo(this.model, "change", this.render);   // works
        this.listenTo(this.model, "marquee:add", this.renderMarquee);  // only called when changed, but not when initially created
    ...
}

renderMarquee IS вызывается при изменении модели, но не при ее инициализации. События 'change' работают как положено (вызывается this.render). Есть предположения?

Спасибо!


person ururk    schedule 03.05.2013    source источник


Ответы (2)


Это не имеет большого смысла, потому что вы инициализируете модель где-то до выполнения вызова view.listenTo. К сожалению, у вас действительно нет выбора в этом вопросе.

Вы, вероятно, захотите переместить обработку событий в Backbone.Collection, в котором уже есть встроенные события, которые вы можете прослушивать для добавления/удаления.

person Andrew Hubbs    schedule 03.05.2013
comment
О, я понимаю, что вы говорите, я знал, что это что-то простое. Я попытался прослушать событие «добавить» коллекцию, но в итоге получил неожиданное поведение. Присмотрюсь к этому поближе, чтобы увидеть, что происходит (каждый раз, когда я добавлял модель в коллекцию, для каждой модели в коллекции вызывалось событие «добавить»). - person ururk; 03.05.2013

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

var Model = Backbone.Model = function(attributes, options) {
    ...
    this.set(attrs, options);
    this.changed = {};
    this.initialize.apply(this, arguments); 
  };

set выполняется до того, как initialize и this.change опустеют, устанавливая состояние модели на «ничего не изменилось».

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

initialize: function(attributes, options) {
  ...
  this.changed = attributes;
  this.trigger('change');
  for (attr_name in attributes) {
    this.trigger('change:' + attr_name);
  }
},

Я запускаю все события изменения вручную, это важно для меня, поскольку наследование моделей может быть связано с change или change:attrxy. Но этого недостаточно, потому что, если я просто вызову события, метод changedAttributes() вернет false, поэтому я также установил this.changed для текущих атрибутов.

person select    schedule 25.06.2014