2012-10-09 27 views
3
App.CurtainView = Ember.View.extend 
    name: "CurtainView" 
    getName: -> 
    console.log @get("name") 

App.ButtonView = App.CurtainView.extend 
    name: "ButtonView" 
    getName: -> 
    # Do something 
    @_super() 

在控制檯上返回:如何使用父對象上下文來創建_super()?

ButtonView 

...但我預計:

CurtainView 

我想這是一個方面的問題 - 我怎樣才能使使用父_super()對象範圍內?

+3

你要替換的名字,所以這IMO是預期的行爲在這裏。 –

回答

2

我並不完全明白你的目標。此行爲是一樣的,你會用Ruby語言期望,但確實是從您將使用Java 獲得有什麼不同(假設你將重新定義Button子類的name屬性) ...

事實上,你必須知道的Ember的對象模型中實現更好的瞭解你的行爲方式:

App = Ember.Application.create(); 

App.CurtainView = Ember.View.extend({ 
    name: "CurtainView", 
    getName: function() { 
    console.log(this.get("name")); 
    } 
}); 

App.ButtonView = App.CurtainView.extend({ 
    name: "ButtonView", 
    getName: function() { 
    this._super(); 
    } 
}); 

var c = App.CurtainView.create(), 
    b = App.ButtonView.create(); 

console.log(c.getName.toString()); 
console.log(b.getName.toString()); 

c.getName(); 
b.getName(); 
b.getName.apply(c); 

_super通話應用由默認到其當前函數被調用的對象。

您可以通過調用getNameapplycall並通過撥用目標來覆蓋此默認行爲。但似乎很奇怪,我...

JSFiddle here

+0

謝謝你看看我的問題。我確實有一個Java背景,看起來我不知道如何實現我的最終目標,即:在App.CurtainView中有一個play()方法,它使用這個。$()來執行一些動畫。我的App.ButtonView也有一個play()方法,也使用了這個。$(),但是現在當然App.CurtainView從來沒有得到動畫,因爲它的這個。$()不再指向正確的模板。你會如何實現這一目標? (現在我正在使用this.get(「parentView」)play()) – kraftwer1

+0

我認爲你在最後一次發言中指出了這件事:你的兩個實體之間的關係相當'有'而不是'is'視圖的構成似乎比繼承視圖類的層次更適合。似乎是正確的方向... –

+0

好的,那將是一條路。但是,我如何通知很多觀點,發生了一些事情(假設我的視頻解僱了「結束」事件,最多五個觀點必須對此做些什麼)?我應該循環this.get(「childViews」)並調用它們的end() - 函數嗎?或者我應該考慮一個基於事件的系統(雖然我沒有得到Em.Application.create({customEvents:{...}});工作......)?或者我應該使用isPlaying屬性構建一個視頻控制器(儘管我找不到讓我的視圖對控制器作出反應的簡單方法...)。你會選擇哪種方式? – kraftwer1

相關問題