Это немного сложно, потому что вы находитесь в шаблоне. При подготовке шаблона KO обращается к переменной (ну, на самом деле, к нему в jQuery Templates обращается функция, созданная KO).
Один из вариантов - передать свойство в виде строки в пользовательскую привязку и убедиться, что она инициализирована.
Это было бы как:
ko.bindingHandlers.valueWithInit = {
init: function(element, valueAccessor, allBindingsAccessor, context) {
var value = valueAccessor();
if (!context[value]) {
context[value] = ko.observable();
}
var realValueAccessor = function() {
return context[value];
}
//call the real value binding
ko.bindingHandlers.value.init(element, realValueAccessor, allBindingsAccessor, context);
},
update: function (element, valueAccessor, allBindingsAccessor, context) {
var realValueAccessor = function() {
return context[valueAccessor()];
}
//call the real value binding
ko.bindingHandlers.value.update(element, realValueAccessor);
}
}
Итак, это подтвердит, что у вашего объекта есть поле, а если нет, то создаст новую наблюдаемую для этого поля. Затем он передает его привязке к реальной стоимости.
Очень похожей (но менее многословной) альтернативой этому было бы наличие привязки, обеспечивающей наличие поля, и затем переписывание атрибута привязки для использования реальной привязки value
. Что-то вроде:
//Another option: rewrite binding after making sure that it is initialized
ko.bindingHandlers.valueWithInit = {
init: function(element, valueAccessor, allBindingsAccessor, context) {
var value = valueAccessor();
if (!context[value]) {
context[value] = ko.observable();
}
$(element).attr("data-bind", "value: " + value);
ko.applyBindings(context, element);
}
}
Оба из них предполагают, что передаваемое вами поле находится вне объекта, который является контекстом вашего шаблона (поэтому оно не будет работать, если вы передадите что-то с глобальной областью действия, например 'viewModel.someProperty').
Вот рабочий образец с обоими вариантами: http://jsfiddle.net/rniemeyer/dFSeB/
Я бы предпочел не передавать поле как строку, но я не вижу в этом хорошего пути.