0

我正在使用 RPNiemeyer 的 kendo-knockout 库。我有一个剑道窗口:

HTML:

<div data-bind="kendoWindow: {isOpen: isOpen, title:'Language', width: 400, height: 200, modal: true, widget: popUpWindow }" > 

居中窗口的 JavaScript 部分:

this.popUpWindow = ko.observable();
    self.isOpen.subscribe(function (newValue) {
        if (newValue) {
            self.popUpWindow().center();
        }
    });

我正在使用上一个问题中的源代码作为我的小提琴:

Kendo-Knockout:窗口没有正确关闭

我正在按照此处显示的步骤操作:

Kendo-Knockout:如何使窗口居中

我正在定义可观察的小部件,但是当我想使用它时,它并没有填充实际的小部件。

小提琴:http: //jsfiddle.net/dcYRM/15/

任何有关工作示例的帮助将不胜感激。

4

1 回答 1

3

看起来有几个问题:

首先,您的isOpen订阅在小部件被填充之前正在运行。

其次,在填充小部件后,它会导致数据源被刷新,并试图序列化包括小部件在内的模型,这会导致问题。这最终是因为 Knockout-Kendo 在解包传递给网格的数据方面有点过于激进。

我看到了两种非常简单的方法来解决这个问题。open最简单的方法是为小部件的事件和呼叫中心设置一个全局处理程序。

将此与上一个问题中的事件放在一起close看起来像:

  ko.bindingHandlers.kendoWindow.options = {
    close: function() {
      $('.k-window, .k-overlay').remove();
    },
    open: function(event) {
       event.sender.center();
    }
  };

现在,无论何时打开任何窗口,它都会居中,您根本不需要弄乱小部件。示例:http: //jsfiddle.net/rniemeyer/F4JGG/

这看起来是最好的选择。要使其与对小部件本身的引用一起使用,您需要解决库中的问题。如上所述,它有点过于激进并且展开选项,并且似乎这会在初始化小部件、传递小部件参数并且已经填充有小部件时导致问题。当我有机会时,我应该能够在图书馆解决它。

否则,您将不得不这样做:

self.popUpWindow = ko.observable();
self.popUpWindow.subscribe(function (widget) {
  if (widget) {
    widget.center();
    self.popUpWindow(null); //hack - Knockout-Kendo should handle this one
  }
});

因此,请在调用后清除 observable center。这是一个示例:http: //jsfiddle.net/rniemeyer/PVMjy/。我还订阅了小部件的 observable 本身,因此没有isOpen上面提到的时间问题。

在这种情况下,设置全局open处理程序似乎是最干净和最好的选择。

于 2013-01-08T14:48:31.163 回答