Knockoutjs错误:您无法多次将绑定应用于同一元素

时间:2016-05-28 09:44:11

标签: javascript jquery html knockout.js

我正在尝试自动填充现有网页中无法更改的元素,并且该网页使用Knockoutjs。 input元素或多或少看起来像这样:

RDD<String> textFile = sc.textFile(filePath, 2);
JavaRDD<String> javaRDD = textFile.toJavaRDD(); 

然后我使用Knockoutjs尝试取消绑定textInput并使用我需要的任何值动态填充输入元素,所以我这样做:

<input maxlength="8" id="xxx" data-bind="textInput: otcInput" type="tel">

然而,这会导致错误ko.cleanNode($('#xxx')); ko.applyBindings({ otcInput: ko.observable("123") // populate myself }); ...问题是为什么?我已经在清理节点......或者我不是吗?是否有一种方法可以使用knockoutjs来查看在尝试执行我的“覆盖”You cannot apply bindings multiple times to the same element时是否存在悬挂的绑定或残羹剩饭?

我还试过其他方法通过JQuery sendkeys plugin设置输入值但没有成功,即

ko.applyBindings

我也尝试过:

$('#xxx').sendkeys('123'); // nothing happens

1 个答案:

答案 0 :(得分:6)

您正在将jQuery对象传递给cleanNode。就像applyBindings一样,它必须是一个DOM元素,而不是一个jQuery对象。所以:

ko.cleanNode($('#xxx')[0]);
// -------------------^^^

示例 - 失败:

ko.applyBindings({
  foo: ko.observable("one")
}, $("#test")[0]);
ko.cleanNode($("#test"));
ko.applyBindings({
  foo: ko.observable("two")
}, $("#test")[0]);
<div id="test">
  <div data-bind="text: foo"></div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

...但是这个([0])有效:

ko.applyBindings({
  foo: ko.observable("one")
}, $("#test")[0]);
ko.cleanNode($("#test")[0]);
ko.applyBindings({
  foo: ko.observable("two")
}, $("#test")[0]);
<div id="test">
  <div data-bind="text: foo"></div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

  

我还尝试了其他方法来设置输入值

如果那是你的目标,你不必捣乱绑定(这可能会产生不良影响),只是:

$("#xxx").val("new value").trigger("change");

{K}需要trigger("change")来查看更改并更新可观察对象。 (或者因为它是textInput绑定,您可以使用input而不是change。)

示例 - 失败:

// The previously-bound stuff:
var vm = {
  foo: ko.observable("foo")
};
ko.applyBindings(vm, document.body);

// Prove the observable and input are in sync:
console.log("check1", vm.foo(), $("#test").val());

// Update the field
$("#test").val("updated").trigger("change");

// Prove the observable and input are still in sync:
console.log("check2", vm.foo(), $("#test").val());
<input id="test" type="text" data-bind="textInput: foo">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>