【问题标题】:Should I really use datafor to check if a knockout binding exists我真的应该使用 datafor 检查是否存在淘汰赛绑定
【发布时间】:2013-07-17 07:07:59
【问题描述】:

通过这段代码,我可以测试一个 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'));

            });

        });

【问题讨论】:

  • 您为什么要多次应用绑定?在orderViewresponseView 的容器内使用模板绑定,并根据路由进行更改
  • 因为我会多次访问同一个 url 并且调用了 applyBinding。

标签: knockout.js


【解决方案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");

【讨论】:

    【解决方案2】:

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

    this.get('#/orders', function () {                
    
       var ovm = new OrderViewModel(),
           element = document.getElementById('orderView');
       ko.cleanNode(element);
       ko.applyBindings(ovm , element);
    
    });
    

    【讨论】:

    【解决方案3】:

    您应该只调用一次applybindings,而不是解决淘汰赛引发的异常。

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-03-30
      • 1970-01-01
      • 2018-04-19
      • 2013-04-27
      • 2013-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多