Kendo-Knockout:关闭窗口打破绑定

时间:2012-12-14 18:30:46

标签: knockout.js kendo-ui

我正在使用RPNiemeyer的kendo-knockout库。我有一个按钮,onclick实例化一个javascript对象,将div绑定到该对象并打开一个弹出窗口。当我从右上角的x按钮关闭窗口时(我没有导入图像,并且在小提琴中没有正确显示),绑定被破坏,按钮不会再次打开窗口。这是我的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.openPopUp = function () {
                    self.isOpen(true);                    
                };
        ProductionStatesList.prototype.close = function () {
            self.isOpen(false);
        }
};
    var elementIsBound = function (elementId) {
                return !!ko.dataFor(document.getElementById(elementId));
            };

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

        productionStatesList.openPopUp();
    }

以下是jsfiddle中的代码: http://jsfiddle.net/5Zkyg/40/

重现的步骤:

1.单击按钮。弹出窗口打开。

2.从右上方的图像关闭窗口(由于未导入图像,因此未显示x按钮。)

请解释为什么这不起作用的原因,任何解决方案将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:2)

主要问题是后续调用openPopup正在创建ProductionStatesList的新实例并在其上调用openPopup,而元素绑定到原始实例。

一种解决方案是在函数之外创建您的实例,例如:http://jsfiddle.net/rniemeyer/bZF9k/

否则,如果你有一个ProductionStatesList实例的数组,并希望用Knockout管理整个事件,那么你可能想要创建一个selectedProductionStatesList observable并使用with绑定窗户内的区域周围,每次都会反弹。