我们使用MVC构建器进行Kendo上传,但有时我们需要做类似的事情:
$("#someUploadId").data("kendoUpload").setOptions({
//some options
});
(我意识到你可以通过包装器设置大多数东西,但有时我们需要处理特殊情况的自定义javascript。)
但是,如果我把它放在doc.ready中它会失败,因为它没有找到kendoUpload属性。这是一个时间问题,因为在doc ready中,kendoUploader仍在初始化并且尚未存在。我可以使用setTimeout等待一秒钟,它会起作用,因为这会让kendo控制时间初始化,但是以这种方式使用setTimeout显然是一个黑客,可能不可靠。
通常这样的库会发生某种事件,表示控件已准备好/已初始化。我还没有能够找到任何表明kendoUpload类似结构的文档。如何确定KendoUpload何时准备就绪?
答案 0 :(得分:2)
不幸的是,没有这样的事件。
但是,从MVC构建器生成的JS只是包装在jQuery就绪块中,因此您需要做的是将需要访问窗口小部件的代码放在构建器指令下面的jQuery ready块中。
这将起作用,因为所有就绪块都是按顺序执行的,并且一旦调用插件方法,小部件本身就准备好了(没有异步初始化)。
您也可以尝试自己实施活动,例如:通过创建初始化对象:
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;
}
}
};
然后使用初始化程序使每个小部件注册自己:
kendo.ui.Widget.fn.init = function (originalFn) {
return function () {
originalFn.apply(this, arguments);
// mark one widget as initialized;
// pass this.options.name and resolve per widget type
kendoInitializer.resolveOne(this.options.name);
};
}(kendo.ui.Widget.fn.init);
然后像这样使用它:
kendoInitializer.waitFor("DropDownList", 1);
kendoInitializer.waitFor("Window", 1);
kendoInitializer.promise.done(function () {
console.log("all widgets initialized");
});
这只是一个原型,需要你声明你想要等待的小部件的数量;可能有办法解决这个问题。
(demo)
答案 1 :(得分:0)
您可以尝试使用dataBound事件。来自documnetation
当窗口小部件绑定到其数据源中的数据时触发。
因此,当数据绑定并绘制到DOM时,此事件将触发。我不确定你需要它,但我们正在使用它来为行中的某些单元格添加自定义CSS,如果我们使用Kendo模板等,这将是一团糟。
请注意,只要数据重新绘制到DOM,即表格被过滤,排序等时,就会触发此事。