Можно ли в 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
, который является наблюдаемым со значением «привет».
Если вам интересно, зачем мне это нужно, я пытаюсь отобразить динамическую таблицу с нокаутом, где и строки, и столбцы являются наблюдаемыми массивами, и я хочу, чтобы определения столбцов содержали выражение привязки для этого столбца. I.e., я хочу иметь возможность сделать это:
<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 быть функцией, которая принимает строку и столбец в качестве аргументов и возвращает наблюдаемое значение. Этот метод демонстрируется в этой скрипте.
with
/eval
для этого. Нет ничего встроенного в нокаут, чтобы сделать это. - person Jeff Mercado   schedule 13.12.2012