2012-06-01 59 views
5

我想實現在主幹可逆的動畫,以同樣的方式,我們做jQuery中:在Backbone.js的事件實現切換

$('a.contact').toggle(
function(){ 
    // odd clicks 
}, 
function(){ 
    // even clicks 
}); 

我的問題是如何在骨幹網的事件語法做到這一點? 如何模仿功能,功能設置?

events : { 
    'click .toggleDiv' : this.doToggle 
}, 

doToggle : function() { ??? } 

回答

14

骨幹查看事件直接委託給jQuery的,給你通過回調方法訪問所有的標準DOM事件參數。所以,你可以方便地調用jQuery的切換方法的元素:


Backbone.View.extend({ 

    events: { 
    "click a.contact": "linkClicked" 
    }, 

    linkClicked: function(e){ 
    $(e.currentTarget).toggle(
     function() { 
     // odd clicks 
     }, 
     function() { 
     // even clicks 
     } 
    ); 
    } 

}); 
+0

Thanks @Derick Bailey!我想我可以做這樣的事情,但它不會發生在我使用currentTarget – Petrov

+5

我不認爲這是正確的@Derick。帶有兩個參數的jQuery切換將爲e.currentTarget添加一個點擊事件處理程序,它將在偶數/奇數點擊中調用這些函數。如果你使用這個,每次點擊a.contact時,新的處理程序將被再次添加。 – johnkpaul

+0

呃,是的。不知道當我回答這個問題時我在想什麼:P –

0

您想在接收事件的視圖中切換的元素是?如果是這樣的:

doToggle: function() { 
    this.$("a.contact").toggle() 
} 
+0

您可以對此進行優化,因爲doToggle在點擊過程中發生。你有'event.target'作爲點擊的目標元素,所以'toggle:function(ev){$(ev.target).toggle()}'應該可以 – Deeptechtons

0

我真的相信只有做到這一點使用events是爲了維持實際流量一起添加trigger。說實話,必須以這種方式使用切換似乎有點笨拙。

Backbone.View.extend({ 

    events: { 
    "click .button": "doToggle" 
    }, 

    doToggle: function(e){ 
    var myEle = $(e.currentTarget); 
    $(e.currentTarget).toggle(
     function() { 
     // odd clicks 
     }, 
     function() { 
     // even clicks 
     } 
    ); 
    myEle.trigger('click'); 
    } 

}); 

它可能更清潔,只需使用

Backbone.View.extend({ 

    el: '#el', 

    initalize: function() { 
    this.render(); 
    }, 

    doToggle: { 
    var myEle = this.$el.find('.myEle'); 
    myEle.toggle(
     function() { 
     // odd clicks 
     }, 
     function() { 
     // even clicks 
     } 
    ); 
    }, 

    render: function(e){ 


    //other stuff 

    this.doToggle(); 

    return this; 
    } 

}); 
4

我一直在尋找解決這個問題,我只是去它的老式方法。我也希望能夠從我的應用中的其他視圖中找到我的hideText()方法。

因此,現在我可以從任何其他視圖檢查'showmeState'的狀態,並根據我想要使用它來運行hideText()或showText()。我試圖通過刪除渲染和初始化之類的東西來簡化下面的代碼,使示例更清晰。

var View = Backbone.View.extend({ 
    events: { 
    'click': 'toggleContent' 
    }, 
    showmeState: true, 
    toggleContent: function(){ 
    if (this.showmeState === false) { 
     this.showText(); 
    } else { 
     this.hideText(); 
    } 
    }, 
    hideText: function() { 
    this.$el.find('p').hide(); 
    this.showmeState = false; 
    }, 
    showText: function() { 
    this.$el.find('p').show(); 
    this.showmeState = true; 
    } 
}); 

var view = new View(); 
+0

這工作完美無瑕。至少我接受的答案對我來說沒有任何問題,因爲我在同一個班上有多個切換事件。 – iankit