2012-04-11 2 views
0

Сортировка начинающего пользователя javascript, читающего учебное пособие backbone.js http://arturadib.com/hello-backbonejs/docs/5.html, и у вас есть несколько вопросов о некотором коде, который использует автор.Что вызывает функцию изменения в обратном направлении

В функции инициализации ниже, автор связывает

this.model.bind('change', this.render); 
    this.model.bind('remove', this.unrender); 

Я предполагаю, что это означает, что функция render называется на «этого» объекта всякий раз, когда функция изменения называется, и unrender запускается всякий раз, когда remove называется. Проблема для меня в том, что не существует определенная функция 'remove' в своем коде, но не определена функция 'change'

Вопрос: Есть ли change и remove относятся к функциям Jquery или же функция remove относятся к функции remove, определенной в (т.е. он переопределяет функцию jquery), а change - функция jquery. Если последнее, что именно вызывает функцию 'change', если она никогда явно не называется и, следовательно, функция render?

Код

var ItemView = Backbone.View.extend({ 
    tagName: 'li', // name of tag to be created   


    events: { 
     'click span.swap': 'swap', 
     'click span.delete': 'remove' 
    },  


    initialize: function(){ 
     _.bindAll(this, 'render', 'unrender', 'swap', 'remove'); // every function that uses 'this' as the current object should be in here 

     this.model.bind('change', this.render); 
     this.model.bind('remove', this.unrender); 
    }, 


    render: function(){ 
     $(this.el).html('<span style="color:black;">'+this.model.get('part1')+' '+this.model.get('part2')+'</span> &nbsp; &nbsp; <span class="swap" style="font-family:sans-serif; color:blue; cursor:pointer;">[swap]</span> <span class="delete" style="cursor:pointer; color:red; font-family:sans-serif;">[delete]</span>'); 
     return this; // for chainable calls, like .render().el 
    }, 


    unrender: function(){ 
     $(this.el).remove(); 
    }, 


    swap: function(){ 
     var swapped = { 
     part1: this.model.get('part2'), 
     part2: this.model.get('part1') 
     }; 
     this.model.set(swapped); 
    }, 



    remove: function(){ 
     this.model.destroy(); 
    } 
    }); 

ответ

2

change и remove являются Магистральные события, а не Jquery события. Это:

this.model.bind('change', this.render); 
this.model.bind('remove', this.unrender); 

означает, что this.render будет вызываться, когда модель запускает change события и this.unrender будет вызываться, когда модель запускает remove события. set method on models:

наборmodel.set(attributes, [options])

Установите хэш атрибутов (одного или нескольких) на модели. Если какой-либо из атрибутов изменит состояние модели, произойдет событие "change", если только {silent: true} не передано в качестве опции.

является одним из способов, чтобы вызвать change событиечрезвычайной модели, unset и clear также будут вызывать change события.

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

Возможно, вы захотите прочитать (неплохо) Backbone documentation и посмотреть, в частности, Catalog of Events.

+0

Большое спасибо. Теперь я понимаю событие изменения, но какие триггеры удаляются в этом коде? это явный вызов «удалить», и если этого не существует, как удалить его? – Leahcim

+0

@Michael: Я ничего там не вижу, что приведет к событию 'remove', которое обычно происходит из [' Collection # remove'] (http://documentcloud.github.com/backbone/#Collection-remove) , Метод 'remove' в представлении вызовет событие [' destroy'] (http://documentcloud.github.com/backbone/#Model-destroy). –

+0

, так что эта строка невелика? this.model.bind ('remove', this.unrender); Я думал, что удаление должно быть запущено для unrender, а затем запускаться. – Leahcim

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