2014-10-23 1 views
1

Я использую следующие привязки:Нокаут связывание не работает для входного типа = «текст»

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

      var value = ko.utils.unwrapObservable(valueAccessor()), 
       precision = ko.utils.unwrapObservable(allBindingsAccessor().precision) || ko.bindingHandlers.numericText.defaultPrecision, 
       formattedValue = value.toFixed(precision); 

      console.log(formattedValue); 
      ko.bindingHandlers.text.update(element, function() { return formattedValue; }); 
     }, 
     defaultPrecision: 1 
    }; 

и этот HTML

 <input id="Price0" data-bind="numericText: price, valueUpdate:'afterkeydown'"> 
     <input id="Price1" data-bind="numericText: price(), valueUpdate:'afterkeydown'"> 
     <input id="Price2" data-bind="value: price, valueUpdate:'afterkeydown'"> 
     <input id="Price3" data-bind="text: price, valueUpdate:'afterkeydown'"> 
     1:<span data-bind="text: price"></span>&nbsp; 
     2:<span data-bind="text: price()"></span>&nbsp; 

Теперь он работает на пролетах, но не на input type = text (price0 и price1)

Я хотел бы создать двухстороннюю привязку между моей моделью просмотра и текстовым полем, и это первая часть моего процесса try.

Когда я обновляю ViewModel пролеты должны обновляться, но не price0 и price1

ответ

1

Это потому, что вы используете text связывания внутри numericText связывания вы создали. Это привязка не работает на входных элементах. Для этого вам нужно использовать привязку value.

EDIT:

Я не уверен, что вы можете использовать значение связывания в вашем связывания, как это. Ниже приведен пример рабочего значения стиля связывания:

ko.bindingHandlers.ValueStyle = { 
    init: function(element, valueAccessor) { 
     //update value on vm when box is changed 
     $(element).on("change.koBinding", function() { 
     var curStr, curVal; 
     curVal = valueAccessor(); 
     curStr = $(element).val(); 
     curVal(/*put whatever you want the vm to update to here*/); 
     }); 

     //on disposal of binding 
     return ko.utils.domNodeDisposal.addDisposeCallback(element, function() { 
     return $(element).off("change.koBinding"); 
     }); 
    }, 
    update: function(element, valueAccessor) { 
     // your formatting code here 
     return $(element).val(formatted result); 
    } 
    }; 
+0

Когда я изменить его на 'ko.bindingHandlers.value.update (элемент, функция() {возвращение FormattedValue;});' это не работает либо .... – Michel

+0

См. мое редактирование по моему ответу – pquest

+0

Спасибо! Форматирование измененных данных при обновлении vm теперь выполняется (возвращаемый $ (элемент) .val (форматированный результат); 'part), но я не могу заставить эту часть работать, чтобы обновить viewmodel. В этой части ('curStr = $ (element) .val();') я прочитал новое введенное значение в поле ввода, а 'curVal = valueAccessor()' возвращает текущее значение vm. Но с этим кодом 'curVal (/ * помещает все, что вы хотите, чтобы vm обновлялся здесь * /);' Кажется, я не могу установить новое значение в viewmodel. Например, curVal (7) дает мне эту ошибку 'Uncaught TypeError: number is not a function' и не задает viewmodel в 7 – Michel

Смежные вопросы