【发布时间】:2015-05-27 05:39:26
【问题描述】:
我有在 ajax 应用程序中创建的视图模型。 ko.applyBindings() 在我渲染我的第一段 html 时被调用。稍后我进行第二次 ajax 调用以呈现 html 的另一部分并绑定到同一个视图模型。但是,因为当我第一次调用 ko.applyBindings() 时,第二个 ajax 中的 html 元素不存在,所以当我的第二部分 html 被检索时,数据绑定不起作用。
这是一个非常简单的示例,其中第一个复选框正确绑定。然后 content2 将通过后续的 ajax 调用加载,并且复选框无法绑定
<div id='container'>
<div id="content1"> <span>Opt In</span>
<input data-val-required="field is required." id="cbOptIn" name="OptIn" type="checkbox" data-bind="checked: OptIn"/>
</div>
</div
var ViewModel = function () {
var self = this;
self.OptIn = ko.observable(false);
self.OptIn2 = ko.observable(false);
}
var appVM = new ViewModel();
ko.applyBindings(appVM);
appVM.OptIn(true);
var content2 = document.createElement('div');
content2.id = 'content2';
content2.innerHTML = '<span>Opt In2</span><input data-val-required="field is required." id="cbOptIn2" name="OptIn2" type="checkbox" data-bind="checked: OptIn2"/>';
document.getElementById('container').appendChild(content2);
appVM.OptIn2(true);
我也尝试通过创建两个单独的视图模型来解决这个问题,但后来我得到了
"You cannot apply bindings multiple times to the same element."
【问题讨论】:
-
您不能多次应用
applybindingsko 的工作原理。但是您可以尝试使用cleanNode并在主div 上重新应用绑定应该可以正常工作。欢呼 -
如果 cleanNode 那么我将不得不重新填充整个模型?
-
确实是的,它在这里重新评估了小提琴jsfiddle.net/supercool/BrsmC/47。有一种更好的方法(并非总是如此),例如您可以在第一次 applybindings 和
hide it以及在 ajax 成功showit 的 div 中编写动态内容。欢呼 -
进行 Ajax 调用的 Web 服务是否返回 JSON 或 HTML?通常的 KO 方法是使用
self.optInList = ko.observableArray([OptIn, OptIn2]),然后通过<div id="content1" data-bind="foreach: optInList">更新 DOM。然后,当您的 Ajax 调用获取新的 optIn 项时,您将它们推送到列表中,并且 DOM 更新、绑定等等。 -
我在返回 HTML 时遇到问题的 Ajax 调用。当我进行 Ajax 调用以更新先前呈现的 HTML 片段时,我已经在执行您所描述的操作了
标签: knockout.js