2013-04-15 4 views
2

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

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

+4

Параметр '«изменение»' обработчики событий получают два аргумента: http://backbonejs.org/#Events-catalog –

+0

Спасибо, это то, что я искал – sublime

+0

Вы спросили: «Кто-нибудь знает, что параметр по умолчанию передан методу рендеринга? " Тогда вам нужно было спросить, каковы были аргументы, переданные слушателю события изменения модели? В представлении Render нет параметров по умолчанию. –

ответ

2

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

В позвоночнике sources:

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

И поэтому в documentation, как mu слишком короткий прокомментировал:

«change» (модель, опции) - при изменении атрибутов модели.

0

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

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 «рассказать объект для прослушивания определенного события на объекте «другой» «

+0

, но он каким-то образом получает параметр, мне просто интересно, что это за параметр, и если он поможет мне каким-то образом отладить – sublime

0

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

, если вы попытаетесь это сделать (слушать другой метод вместо визуализации):

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, вы вызываете метод визуализации вне представления.

+0

Иногда консоль не будет отображать аргументы, если вы оставите список параметров функции пустым. Я бы рекомендовал добавить 'function (a, b, c, d, e, f) {' Добавление длинного списка параметров гарантирует, что будут отображаться все параметры. Это перебор, но он работает каждый раз. –

+0

@CoryDanielson есть ли у вас пример? Я никогда не был в таком случае лично, поэтому мне очень интересно. – Loamhoof

+0

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

0

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

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 событие

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