1

使用此代码,我可以测试一个 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'));

            });

        });
4

3 回答 3

1

在应用绑定之前,您可以简单地从元素中删除绑定

this.get('#/orders', function () {                

   var ovm = new OrderViewModel(),
       element = document.getElementById('orderView');
   ko.cleanNode(element);
   ko.applyBindings(ovm , element);

});
于 2013-07-18T12:05:04.377 回答
1

You cannot apply bindings multiple times to the same element.当多次应用绑定时,Knockoutjs 版本 2.3.0 将引发异常 ( ),因此您只需添加一个 try-catch:

try {
   ko.applyBindings(ovm, document.getElementById('orderView'));
} 
catch(e) {
}       

Knockoutjs 使用这个语句来检查一个元素是否已经被绑定,但这并没有对外暴露:

var alreadyBound = ko.utils.domData.get(node, "__ko_boundElement");
于 2013-07-18T11:52:52.703 回答
0

您应该只调用一次 applybindings 并且不能解决淘汰赛引发的异常。

当调用订单或客户时,您应该更新视图模型中的数据,视图将自动更新。这就是使用 MVVM 的重点。

MVVM 模式意味着我们有属性告诉视图在数据更改时更新,因此将新数据插入您的可观察属性并且视图将更新。

我很想组成一个客户和订单对象的视图模型,因此可以在整个文档上调用一次 applyBindings。它通常会为我带来更清晰的代码。

于 2013-12-09T23:44:03.083 回答