当Javascript更改输入值时更新observable

时间:2013-05-01 18:29:17

标签: javascript knockout.js

有没有办法在<input>值更改时更新observable,但是以编程方式,即通过Javascript更新?

以下是此用例的一个小问题,我无法使其正常工作:http://jsfiddle.net/qYXdJ/

如您所见,点击“通过Javascript更新输入值”链接时,observable显然未更新,因为它未反映在<span>

3 个答案:

答案 0 :(得分:9)

如果你绝对不能直接修改observable(这是最好的方法),你可以触发“onchange”事件(Knockout在内部使用)。使用jQuery,这很简单:

$('#update').on('click', function() {
    $('#input2').val('New Value').trigger('change');
});

如果您因任何原因不想使用jQuery,请查看this question

答案 1 :(得分:4)

正如cyanfish所指出的那样,正确的方法是更新观察者。

如果问题是您的代码无法访问可观察对象,例如您正在编写书签以自动填写表单,那么您可以访问此类可观察对象:

function setValue(input, value) {
  var bindingsString = input.getAttribute('data-bind');
  if (bindingsString) {
    var bindings = ko.bindingProvider.instance.parseBindingsString(bindingsString, ko.contextFor(input), input);
    if (bindings.value) {
      bindings.value(value);
    } else if (bindings.checked) {
      bindings.checked(value);
    } else {
      input.value = value;
    }
  } else {
    input.value = value;
  }
}

答案 2 :(得分:3)

您必须更改viewModel'name'属性而不是输入字段值,因为它是可观察的,并且该属性的任何更改都将反映到所有绑定的html元素。

var viewModel = {
        name: ko.observable()
    };
    ko.applyBindings(viewModel);

    document.getElementById('update').onclick = function(){
        viewModel.name('New Value');
        //document.getElementById('input2').value = 'New Value';
    }