Вы можете получить доступ к объекту JavaScript как к ассоциативному массиву, используя имя вашего поля в качестве ключа (например, object.foo
может быть представлено как object['foo']
). Затем, когда вы указываете на наблюдаемое, вы вызываете его как функцию для получения/установки значения.
Предполагая, что у вас есть такая привязка:
data-bind="DefaultOrCustom: 'firstName'"
Вы можете получить доступ к наблюдаемому следующим образом:
ko.bindingHandlers.DefaultOrCustom = {
update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
var value = valueAccessor(), allBindings = allBindingsAccessor();
var oldValue = viewModel[value](); // read from the observable
viewModel[value]('New Value'); // write to the observable
}
Вы можете стать еще более гибким, проверив тип поля. Если это "функция", то рассматривайте ее как наблюдаемую - используя форму (), в противном случае рассматривайте ее как обычное поле.
ko.bindingHandlers.DefaultOrCustom = {
update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
var value = valueAccessor(), allBindings = allBindingsAccessor();
var oldValue;
if (typeof(viewModel[value]) == 'function') {
oldValue = viewModel[value](); // read from the observable
viewModel[value]('New Value'); // write to the observable
} else {
oldValue = viewModel[value]; // read from the field
viewModel[value] = 'New Value'; // write to the field
}
}
К вашему сведению: typeof
на самом деле не является функцией, но я часто обнаруживаю, что использование этой формы делает более понятным то, что я печатаю.
person
John Earles
schedule
26.06.2012