使用此代码,我可以测试dom节点是否已经与敲除绑定。
我应该在第二次申请绑定之前检查一下,如:
if(!isBound)调用applybinding ...
这真的是我应该怎么做的吗?
有没有更清洁的方法,为什么框架没有为我处理这个?
var isBound = function() {
return !!ko.dataFor(document.getElementById("orderView")));
};
var app = sammy(function () {
this.get('#/orders', function () {
var ovm = new OrderViewModel();
ko.applyBindings(ovm , document.getElementById('orderView'));
});
this.get('#/customers', function () {
var cvm = new CustomerViewModel();
ko.applyBindings(cvm , document.getElementById('responseView'));
});
});
答案 0 :(得分:1)
当绑定被多次应用时,Knockoutjs版本2.3.0会抛出异常(You cannot apply bindings multiple times to the same element.
),所以你可以添加一个try-catch:
try {
ko.applyBindings(ovm, document.getElementById('orderView'));
}
catch(e) {
}
Knockoutjs使用此语句检查元素是否已绑定,但这不是外部公开的:
var alreadyBound = ko.utils.domData.get(node, "__ko_boundElement");
答案 1 :(得分:1)
您可以在应用绑定之前简单地从元素中删除绑定
this.get('#/orders', function () {
var ovm = new OrderViewModel(),
element = document.getElementById('orderView');
ko.cleanNode(element);
ko.applyBindings(ovm , element);
});
答案 2 :(得分:0)
你应该只调用一次applybindings,而不是解决knockout抛出的异常。
当对订单或客户进行调用时,您应该更新视图模型中的数据,视图将自动更新。这是使用MVVM的重点。
MVVM模式意味着我们拥有告诉视图在数据更改时更新的属性,因此将新数据戳入您的可观察属性,视图将更新。
我很想组成一个客户和订单对象的viewModel,因此可以在整个文档上调用一次applyBindings。这通常会为我带来更清晰的代码。