Параметр метода рендеринга представления Backbone по умолчанию

У меня есть представление магистрали, связанное с моделью. Представление прослушивает метод изменения и вызывает рендеринг, если модель изменена.

this.listenTo(this.model, 'change', this.render);

У меня возникла проблема, связанная с тем, что метод рендеринга моего основного представления вызывается несколько раз. Я пытаюсь отладить эту проблему. Для этого я добавил оператор console.log в метод рендеринга:

render: function(data) {
    if(this.model){
        console.log("Render Method:",data," For model:",this.model.cid);
    }
}

Теперь это значение данных иногда печатается как неопределенное или что-то вроде модели. Кто-нибудь знает, какой аргумент передается прослушивателю изменения модели?

Обратите внимание: я ничего не передаю в метод рендеринга.

и в документации по магистрали ничего об этом не упоминается: http://documentcloud.github.io/backbone/#View-render


person sublime    schedule 15.04.2013    source источник
comment
Обработчики событий "change" получают два аргумента: backbonejs.org/#Events-catalog   -  person mu is too short    schedule 16.04.2013
comment
Спасибо, это то, что я искал   -  person sublime    schedule 16.04.2013
comment
Вы спросили: кто-нибудь знает, какой параметр по умолчанию передается в метод рендеринга? Тогда вам нужно было спросить, какие аргументы были переданы слушателю события изменения модели? Представление рендеринга НЕ имеет параметров по умолчанию.   -  person Daniel Aranda    schedule 16.04.2013
comment
Прошу прощения за то, что Даниил редактирует мой вопрос   -  person sublime    schedule 16.04.2013
comment
Нет проблем возвышенное, Спасибо!   -  person Daniel Aranda    schedule 17.04.2013


Ответы (4)


Событие изменения передает model и хэш options

В магистральных исходниках:

 this.trigger('change', this, options);

Итак, в документации указано, что mu слишком короткий прокомментировал:

"change" (модель, параметры) — когда атрибуты модели изменились.

person Eran Medan    schedule 16.04.2013

Насколько мне известно, функция рендеринга не должна передавать ей какие-либо параметры.

  Event.Listen=Backbone.View.extend({
          model: 'something'
        initialize:function(){
           this.listenTo(this.model,'change',this.render);

      }
        render:function(){
          //is called when the listen to event is triggered
          //if(this.model) does not make a lot of sense?? Does it need to be 
             //true ornull
           //call another object
           new Event.DoSomething();

        }
   });

С сайта Backbone "Указать объекту прослушивать определенное событие на "другом" объекте"

person user2280897    schedule 15.04.2013
comment
но он каким-то образом получает параметр, мне просто интересно, что это за параметр, и поможет ли он мне как-то отладить - person sublime; 16.04.2013

Похоже, что внешне для представления есть другие вызовы для рендеринга (дополнительно к прослушивателю событий).

если вы попробуете это (послушайте другой метод вместо рендеринга):

this.listenTo(this.model, 'change', this.customMethod);

А затем объявите это в представлении ниже:

customMethod: function() {
    console.log(arguments, '<==== is there arguments?');
    if(this.model){
        console.log("Custom Render Method For model:",this.model.cid);
    }
}

Поэтому, пожалуйста, просмотрите свой код, где в дополнение к прослушивателю model.change вы вызываете метод рендеринга вне представления.

person Daniel Aranda    schedule 16.04.2013
comment
Иногда консоль не отображает аргументы, если вы оставляете список параметров функции пустым. Я бы рекомендовал добавить function(a,b,c,d,e,f){ Добавление длинного списка параметров гарантирует отображение всех параметров. Это перебор, но это работает каждый раз. - person Cory Danielson; 16.04.2013
comment
@CoryDanielson, у тебя есть пример? Я никогда не был в таком деле лично, поэтому я очень заинтересован. - person Loamhoof; 16.04.2013
comment
Нет, я только что заметил, что иногда консоль ведет себя странно и не отображает аргументы, если только я не задал функциям фиктивные параметры. Может быть из-за старой версии хрома или чего-то еще, я не уверен. Хотя это раздражает. - person Cory Danielson; 17.04.2013

Обратный вызов события вызывается несколько раз, если привязка происходит несколько раз, т.е.

this.listenTo(this.model, 'change', this.render);

выполняется несколько раз.

Это также может произойти, если change срабатывает несколько раз. например. вы устанавливаете каждый из атрибутов модели в цикле for, а не сразу.

Любой обратный вызов получает событие в качестве аргумента. В твоем случае

render: function(data) {
    if(this.model){
        console.log("Render Method:",data," For model:",this.model.cid);
    }
}

данные будут зарегистрированы как неопределенные при вызове view.render(). данные будут объектом события при запуске событием change

person Venkat Kotra    schedule 16.04.2013