2012-04-11 45 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'

提問:changeremove指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

changeremove是骨幹的事件,而不是jQuery的事件。這些:

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

意味着當模型觸發change事件和模型觸發remove事件this.unrender將被稱爲this.render將被調用。該set method on models

設置model.set(attributes, [options])

設置屬性的模型(一個或多個)的哈希值。如果任何屬性更改模型狀態,則將觸發"change"事件,除非{silent: true}作爲選項傳遞。

是觸發模型change事件,unsetclear也會觸發change事件的一種方式。

remove事件通常來自集合,但集合會通過適當的模型發送它們以防傾聽視圖。

您可能想要閱讀(相當不錯)Backbone documentation並特別查看Catalog of Events

+0

非常感謝。我現在瞭解更改事件,但是在此代碼中刪除了哪些觸發器?是否顯式調用「移除」,如果不存在,移除會如何觸發? – Leahcim 2012-04-11 05:37:01

+0

@Michael:我沒有看到任何會觸發remove事件的東西,通常來自['Collection#remove'](http://documentcloud.github.com/backbone/#Collection-remove) 。視圖上的remove方法會觸發['destroy'](http://documentcloud.github.com/backbone/#Model-destroy)事件。 – 2012-04-11 05:44:12

+0

所以這條線是微不足道的? this.model.bind('remove',this。unrender);我認爲刪除需要被觸發才能被觸發。 – Leahcim 2012-04-11 06:03:43