2012-12-17 62 views
0

我会用以前问问题的代码小的改动绑定元素的值时,但情况是不同的突破:剑道淘汰赛:绑定改变

Kendo-Knockout: Closing window breaks bindings

HTML:

<button onclick="openPopUp()">OpenPopUp</button> 

<div id="productionStates" class="hidden"> 
    <div data-bind="kendoWindow: { isOpen: isOpen, title:'States', center:true, width: 600, height: 150, modal: true, resizable: false, actions: ['Maximize', 'Close'] }" > 
     <fieldset> 
      <legend>Change state:</legend> 
      <table> 
       <tr data-bind="foreach: productionStates"> 
        <td><button class="k-button" data-bind="value: ProductionState, text: ProductionState" /></td> 
       </tr> 
      </table> 
     </fieldset> 
    </div> 

</div> 

的javascript:

var ProductionStatesList = function() { 
    var self = this; 

    ProductionStatesList.prototype.productionStates = 
     ko.observableArray([ { ProductionState: ko.observable("Pending") } ]); 

     ProductionStatesList.prototype.openPopUp = function() { 
      self.isOpen(true); 
     };  

     ProductionStatesList.prototype.isOpen = ko.observable(false); 

     ProductionStatesList.prototype.close = function() { 
      self.isOpen(false); 
     } 
}; 
    var elementIsBound = function (elementId) { 
       return !!ko.dataFor(document.getElementById(elementId)); 
      }; 


    var myProductionStatesList = ko.observable(); 
    var openPopUp = function(){ 
     myProductionStatesList(new ProductionStatesList()); 
     if (!elementIsBound("productionStates")){ 
      ko.applyBindings(myProductionStatesList, document.getElementById("productionStates")); 
     } 

     myProductionStatesList().openPopUp(); 
    } 

myProductionStatesList是可观察的。点击弹出的按钮打开,我正在实例化ProductionStatesList视图模型并将其值分配给myProductionStatesList。第一次点击按钮时,每个按钮都可以正常工作。当您关闭弹出窗口并再次单击该按钮时,绑定被破坏并且没有任何反应。我期待每按一下按钮,生产状态清单的新实例将被反弹,因为myProductionStatesList是可观察的。我错过了什么?

的jsfiddle:

http://jsfiddle.net/bZF9k/15/

回答

2

我认为,在这种情况下,最好的办法是去一个地步,你不需要调用ko.applyBindings多次。

一个不错的选择是创建一个可观察的模型,该模型包含当前的ProductionStatesListopenPopup函数。然后,在编辑器周围使用with绑定。

视图模型可能只是看起来像:

var viewModel = { 
    myProductionStatesList: ko.observable(), 
    openPopup: function() { 
     var newList = new ProductionStatesList(); 
     this.myProductionStatesList(newList); 
     newList.openPopup(); 
    } 
}; 

这里有一个例子:http://jsfiddle.net/rniemeyer/wBCdK/