2013-12-11 63 views
4

作爲一個例子,這裏就是我希望做......BackboneJS:如何從視圖的事件散列中調用視圖外的函數?

function doSomething(customParameter) { 
    console.log(customParameter); 
} 

var MyView = Backbone.View.extend({ 
    // Other view stuff, skipping it... 
    events: { 
     'click .someClass': doSomething(customParameter) 
    } 
}); 

這裏的動機是我希望能夠給變量(局部視圖)傳遞給視圖之外的一些其他功能。我想這樣做的原因是,「其他功能」只寫入一次而不是四次......它會嚴重地將我的項目保存超過100行代碼。

經過大量的谷歌搜索,我還沒有找到一個解決方案......任何想法?

謝謝!

回答

5

這裏是做這件事的一種方法:

function doSomething(customParameter) { 
    console.log(customParameter); 
} 

var MyView = Backbone.View.extend({ 
    // Other view stuff, skipping it... 
    events: { 
     'click .someClass': function(ev) { doSomething(this.customParameter); } 
    } 
}); 

在這個例子中,你聲明一個將本地視圖所需參數傳遞給doSomething方法的函數。


另一種方式可能是與當前視圖的情況下調用DoSomething的(),如果你不想通過所有必需的參數:

function doSomething(ev) { 
    console.log(this.customParameter); // here, the context this will be the view. 
} 

var MyView = Backbone.View.extend({ 
    // Other view stuff, skipping it... 
    events: { 
     'click .someClass': function(ev) { doSomething.call(this, ev); } 
    } 
}); 

更OOP的做法是對是共同的代碼基礎視點:

var MyBaseView = Backbone.View.extend({ 
    doSomething: function(ev) { 
     console.log(this.customParameter); 
    } 
}); 

var MyView = MyBaseView.extend({ 
    extends: { 
     'click .someClass': 'doSomething' 
    } 
}); 

也許有更多的方式來做到這一點,你只需要看看哪個方案最適合你的需求。

+2

哇,爲什麼我以前從未想過擴展自己的觀點?我的代碼本來可以更清潔。 @PlanetLotus,最後的選擇可能是最適合你的。 – RustyToms

+0

哈哈我也從未想過在主幹代碼中擴展我的一個視圖。非常感謝,我會給最後兩個選項一個鏡頭,看看哪個最適合我! – MattM

+0

到目前爲止,最後一個選項工作得很好。非常感謝!! – MattM

3

你可以嘗試調用,它是內部這就要求有問題的方法的視圖的方法

var MyView = Backbone.View.extend({ 
    // Other view stuff, skipping it... 
    events: { 
     'click .someClass': 'callSomething' 
    }, 
    callSomething: function() { 
     doSomething(customParameter); 
    } 
}); 
+0

我正在做這個目前。問題是callSomething函數在多個視圖中重複使用。它可以工作,但這是代碼的巨大浪費。我想把它放到視圖之外的一個函數中,以便它可以在任何地方調用。寫一次,隨處運行,就像他們所說的:)唯一的區別在於視圖的變量。 – MattM

相關問題