Получение наблюдаемого из модели с помощью String в Knockout.js

Я пишу собственный обработчик привязки в Knockout. Я хочу передать строку, например: firstName, как valueAccessor, затем я хочу получить наблюдаемое firstName из моей модели представления, но как мне получить наблюдаемое по String?

Вот мой код:

ko.bindingHandlers.DefaultOrCustom = {
    update: function (element, valueAccessor, allBindingsAccessor, viewModel) {

        var value = valueAccessor(), allBindings = allBindingsAccessor();
        // value will equal "firstName" at this phase
    } 
}

person guy schaller    schedule 26.06.2012    source источник


Ответы (1)


Вы можете получить доступ к объекту 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
comment
Вместо того, чтобы проверять, является ли это функцией (которая вернет true, если это какой-либо объект), используйте ko.utils.unwrapObservable(), что упростит код, а также сделает его более надежным. - person daedalus28; 26.06.2012