2012-12-12 125 views
2

在knockout.js,是有可能讓一個結合(該結合的值)的右手側是動態的?例如,在knockout.js中,是否可以使用動態綁定值?

<input data-bind="value: dynamicBinding()"/> 
<script type="text/javascript"> 
var vm = { 
    dynamicBinding : function() { 
     return "foo().bar"; 
    }, 
    foo : ko.observable({ 
     bar : ko.observable("hi"); 
    } 
}; 
ko.applyBindings(vm); 
</script> 

的結果應該是同時施加綁定的dynamicBinding功能被執行和產生的字符串被用作結合。輸入元素應該綁定到foo().bar,這是值爲「hi」的可觀察值。

如果你想知道爲什麼我想要這樣做,我試圖呈現一個動態表與敲除,其中行和列都是observableArrays,我想允許列定義包含綁定的表達式該欄。即,我希望能夠做到這一點:

<table data-bind="foreach: data"> 
    <tr data-bind="foreach: $root.columns"> 
    <td data-bind="text: cellValueBinding()"></td> 
    </tr> 
</table> 
<script type="text/javascript"> 
var vm = { 
    data: ko.mapping.fromJS([ 
    {title: "Brave New World", author: { name : "Aldous Huxley" }, 
    {title: "1984", author: { name : "George Orwell" }, 
    {title: "Pale Fire", author: { name : "Vladimir Nabokov" }]), 
    columns: ko.observableArray([ 
    {header: "Title", cellValueBinding: function() { return "$parent.title"; }}, 
    {header: "Author", cellValueBinding: function() { return "$parent.author().name"; }} 
    ]) 
}; 
ko.applyBindings(vm); 
</script> 

正如你看到的例子,列定義知道如何從數據中提取價值。表格標記本身或多或少是一個佔位符。但據我所知,這是行不通的,因爲敲除處理綁定的方式。還有其他選擇嗎?

謝謝。


解決方案:最後我用伊利亞的建議 - 我可以讓cellValueBinding是接受的行和列作爲參數,並返回一個可觀察到的一個功能。這種技術被證明in this fiddle.

+0

如果_absolutely_要動態執行,你不得不求助於使用'with' /'eval'做到這一點。沒有什麼內置的淘汰賽來做到這一點。 –

+0

那麼,歡迎替代品。 :)我很確定我可以很容易地使用模板(每列定義它自己的單元格模板)實現同樣的效果,但感覺有點過重。 https://github.com/mbest/knockout-table – waxwing

+0

你可能結合有興趣在我的表!它看起來像解決了「任意單元值」的問題,就像我打算的那樣 - 通過允許dataItem成爲函數。 –

回答

2

使用ko.computed它。
旁觀例如
JSFiddle
編輯
在你的第二個例子,你可以傳遞$parent值ti功能

<td data-bind="text: cellValueBinding($parent)"></td> 

,並在模型

{header: "Title", cellValueBinding: function (parent) { return parent.title; }}, 
{header: "Author", cellValueBinding: function (parent) { return parent.author().name; }} 

JSFiddle

+1

謝謝,但我沒有看到它在第二個示例中的工作原理。我需要綁定在列定義中。爲了計算工作,它必須是上下文敏感的。具體來說,它必須能夠訪問「$ parent」上下文變量。 – waxwing

+0

@waxwing答案編輯 – Ilya

+0

這可能實際工作。我擴大了你的小提琴,因爲我預料它不會與實際觀測值(和雙向綁定,例如值)工作,但似乎OK:http://jsfiddle.net/7vCNt/2/。我明天將在我真實的代碼中測試這個。謝謝。 – waxwing

相關問題