我是否真的应该使用data来检查是否存在敲除绑定

时间:2013-07-18 11:03:05

标签: knockout.js

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

            });

        });

3 个答案:

答案 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。这通常会为我带来更清晰的代码。