2015-01-12 22 views
2

我想擴展一些Ember.TextField的行爲。我試圖爲type="datetime-local"輸入添加一些邏輯,以便能夠直接綁定日期類型的變量。如何覆蓋EmberJS中的屬性綁定?

正如我們所知,輸入值是字符串,而不是日期。所以在擴展Ember.TextField的新類中,我需要一個新的屬性來綁定到基本上是日期轉換爲輸入需要的字符串的輸入。 理想情況下,我想重新打開Ember.TextField,然後只應用此邏輯,如果輸入類型爲datetime-local並且綁定值是日期。

我的問題是:

有沒有辦法來改變一個超綁定定義的屬性?如果有可能,我可以在我的View/Component子類中編寫attributeBindings:['value:textValue']。這將覆蓋來自Ember.TextField的以前的值綁定定義。

X-參考:https://github.com/emberjs/ember.js/issues/10176

+1

爲什麼你不能只在你的視圖上有一個綁定到文本字段值的屬性?它將是一個字符串,並且您可以讓觀察者觀察該值,並在將字符串轉換爲JS Date對象之後設置相應的模型/控制器屬性(需要爲日期)?有沒有理由爲什麼這不起作用? – Hrishi

+0

我想使用'{{input value = model.startDate}}',就像我對普通輸入做的一樣。 問題是我想要該屬性被命名爲'value'來正常使用輸入助手。 – miguelcobain

回答

2

儘管不是最容易維護的行走路徑,但您可以在視圖中的init事件中手動刪除和添加屬性綁定。 Here is a working JS Bin

只是把屬性綁定的作爲餘燼陣列和使用addObjectremoveObject與完整結合字符串(例如value:testValue作爲該方法的參數):

App.SomeView = Em.View.extend({ 
    attributeBindings: ['value:testValue'] 
}); 

App.ModalView = App.SomeView.extend({ 
    attributeBindings: ['role'], 
    testValue: 'hello', // Could be on either class 
    role: 'dialog', 

    removeBindings: function() { 
    // role stays bound, value doesn't 
    this.get('attributeBindings').removeObject('value:testValue'); 
    }.on('init') 
}); 

同樣,here is a working JS Bin

+0

這不會從'SomeView'中刪除''value:testValue''我假設嗎? – miguelcobain

+0

正確!這不影響App.SomeView類,只是App.ModalView的任何實例。 –

1

attributeBindings是一種「級聯屬性」,這意味着它是其拾取並從繼承鏈,包括混入每類結合值的數組。根據對Ember代碼的粗略閱讀,看起來鏈條上的條目「較低」在之前的中放置在連接的數組中。當元素被構造時,屬性綁定按順序執行,這意味着較早的(較低的,你的)屬性被較晚的(較高的,他們的)屬性覆蓋。

根據您的觀點,您可能稱之爲錯誤。

讓我們假設一個更高(更多超級)班級說att1: val1,並且一個較低(較少超級)班級說明att1: val2。然後val1將「贏」。

更改用於att1的屬性值的替代方法僅僅是在您的子類中重新定義val1,並且它將被正確拾取。

+0

是的,我知道串聯屬性。 我想要重寫一個特定的連接屬性。在這種情況下,'Ember.TextField'定義'attributeBindings:['value']'。我試圖將'Ember.TextField'繼承並重新定義爲'attributeBindings:['value:textValue']'。我試過這個,看來後者會被忽略。 – miguelcobain