Kendo ui 剑道上传准备就绪/初始化事件?

Kendo ui 剑道上传准备就绪/初始化事件?,kendo-ui,kendo-asp.net-mvc,Kendo Ui,Kendo Asp.net Mvc,我们使用MVC构建器进行剑道上传,但有时我们需要这样做: $("#someUploadId").data("kendoUpload").setOptions({ //some options }); kendoInitializer.waitFor("DropDownList", 1); kendoInitializer.waitFor("Window", 1); kendoInitializer.promise.done(function () { console.log("

我们使用MVC构建器进行剑道上传,但有时我们需要这样做:

$("#someUploadId").data("kendoUpload").setOptions({
    //some options
});
kendoInitializer.waitFor("DropDownList", 1);
kendoInitializer.waitFor("Window", 1);
kendoInitializer.promise.done(function () {
    console.log("all widgets initialized");
});
(我知道您可以通过包装器设置大多数内容,但有时我们需要定制javascript来处理特殊情况。)

但是,如果我把它放在doc.ready中,它将失败,因为它没有找到kendoUpload属性。这是一个时间问题,因为在docready中,kendoUploader仍在初始化,并且还不存在。我可以使用setTimeout来等待一秒钟,它会起作用,因为这会给剑道控制时间来初始化,但是以这种方式使用setTimeout显然是一种黑客行为,可能不可靠


通常,像这样的库具有某种类型的事件,表示控件已就绪/初始化。我还没有找到任何文档表明kendoUpload的类似构造。如何确定KendoUpload何时准备就绪?

不幸的是,没有此类事件

但是,从MVC构建器生成的JS只是包装在jQuery就绪块中,因此您需要做的是将访问jQuery就绪块中的小部件所需的代码放在所述小部件的builder指令下面

这将起作用,因为所有就绪块都是按顺序执行的,小部件本身在插件方法被调用时就已经就绪(没有异步初始化)

您也可以尝试自己实现该事件,例如通过创建初始值设定项对象:

var deferred = $.Deferred();
var kendoInitializer = {
    widgets: [],
    total: 0,
    waitFor: function (name, number) {
        this.widgets[name] = number;
        this.total += number;
    },
    deferred: deferred,
    promise: deferred.promise(),
    resolveOne: function (name) {
        console.log(name, "initialized", this.total);
        this.removeOne(name);
        if (this.total <= 0) { // could also resolve per widget type etc.
            this.deferred.resolve();
        }
    },
    removeOne: function (name) {
        if (this.widgets.hasOwnProperty(name)) {
            this.widgets[name] -= 1;
            this.total -= 1;
        }
    }
};
然后像这样使用它:

$("#someUploadId").data("kendoUpload").setOptions({
    //some options
});
kendoInitializer.waitFor("DropDownList", 1);
kendoInitializer.waitFor("Window", 1);
kendoInitializer.promise.done(function () {
    console.log("all widgets initialized");
});
这只是一个原型,它要求您声明要等待的小部件的数量;也许有办法解决这个问题

()

您可以尝试使用该事件。从文档中

当小部件绑定到其数据源中的数据时激发

因此,当数据绑定并绘制到DOM时,将触发此事件。我不确定你需要它做什么,但我们正在使用它向行中的一些单元格添加自定义CSS,如果我们使用剑道模板,这将是一个混乱,等等


请注意,每当数据被重新绘制到DOM时,即当表被过滤、排序等时,都会触发此命令。

谢谢,我测试了此命令,它可以正常工作(对于简单的情况)。不幸的是,在我的例子中,出现了一些奇怪的问题,导致较低的doc.ready无法按顺序执行,我怀疑是因为我们推迟了对
$
的评估;如果这仍然是一个问题,您可以尝试使用类似于我添加到answerMy脚本的解决方案来解决这个问题。我的脚本包含在jquery下面,因此它没有被延迟,因为那时jquery已经加载,但是jquery上面的内联生成器被延迟。我最后要做的是在构建器对附加设置进行函数调用之后添加doc.ready脚本块(在
@节javascriptIncludes
上方)。订单将是Kendo MVC builder,
additionalSetup()
。确保MVC builder内联和我的附加设置都被延迟(延迟脚本确保它们按顺序执行)。我没有意识到doc.ready是确定的,因为它们是按顺序执行的,所以感谢它,因为它帮助我制定了解决方案。如果其他人对我所说的延迟评估感到困惑,我指的是:是的,我以前用过这个,但在这种情况下,我们需要在网格提取数据之前设置选项。也许你的回答会对其他有类似情况的人有所帮助。