如何操纵数据绑定,knockoutJs

时间:2016-12-01 14:43:53

标签: javascript c# knockout.js data-binding

我的客户是网站的成员。他每次都必须填写一份表格。这就是为什么他要我为他开发一个应用程序来自动完成这个过程。当我使用webBrowser控件来操作它时,我能够登录,但之后会有包含数据绑定的字段。这些字段是我需要操作的字段。当我将数据推送到必要的字段时,它不起作用,因为在html标记中,没有值属性,而是具有数据绑定。所以我的问题是我如何操纵和推送数据到这些领域?

非常感谢你提前帮助。

1 个答案:

答案 0 :(得分:0)

Knockout使用数据绑定来监听输入中的更改并更新基础模型。例如,value绑定侦听change个事件,并将新值写入数据绑定observable

如果您通过代码更新value属性,则change事件不会被触发。您将在用户界面中看到新值,但javascript模型无法更新。

您可以通过明确触发更改来解决此问题。这是一个例子:

  • 输入input:您会看到显示淘汰赛更新的console.log
  • 按按钮注入新值:您不会看到日志:淘汰赛未更新
  • 按最后一个按钮可触发change事件。您现在会注意到淘汰赛现在会更新模型。

当然,您可以将两个点击侦听器合并为一个功能。我已将它们分开以获得重点。



// Hidden knockout code:
(function() {
  var label = ko.observable("test");
  label.subscribe(console.log.bind(console));

  ko.applyBindings({ label: label });
}());

// Your code
var buttons = document.querySelectorAll("button");
var input = document.querySelector("input");

buttons[0].addEventListener("click", function() {
  input.value = "generated value";
});

buttons[1].addEventListener("click", function() {
  // http://stackoverflow.com/a/2856602/3297291
  var evt = document.createEvent("HTMLEvents");
  evt.initEvent("change", false, true);
  input.dispatchEvent(evt);
});

<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<input type="text" data-bind="value: label">

<button>inject value from outside</button>
<button>let knockout know something changed</button>
&#13;
&#13;
&#13;