在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.
如果_absolutely_要動態執行,你不得不求助於使用'with' /'eval'做到這一點。沒有什麼內置的淘汰賽來做到這一點。 –
那麼,歡迎替代品。 :)我很確定我可以很容易地使用模板(每列定義它自己的單元格模板)實現同樣的效果,但感覺有點過重。 https://github.com/mbest/knockout-table – waxwing
你可能結合有興趣在我的表!它看起來像解決了「任意單元值」的問題,就像我打算的那樣 - 通過允許dataItem成爲函數。 –