在 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>
从示例中可以看出,列定义知道如何从数据中提取值。表格标记本身或多或少是一个占位符。但据我所知,由于淘汰赛处理绑定的方式,这不起作用。还有其他选择吗?
谢谢。
解决方案:我最终使用了 Ilya 的建议——我可以让 cellValueBinding 成为一个接受行和列作为参数的函数,并返回一个 observable。这种技术在这个小提琴中得到了展示。