Mvvm 剑道布局不呈现没有设置超时的小部件

Mvvm 剑道布局不呈现没有设置超时的小部件,mvvm,frameworks,kendo-ui,kendo-grid,Mvvm,Frameworks,Kendo Ui,Kendo Grid,我将剑道库升级到2014Q1框架,该框架有一些不错的功能,他们正在添加这些功能,但是当我这样做时,它完全破坏了任何小部件网格、tabStrip、选择列表等的渲染。我一直跟踪到布局/视图,如果不将setTimeout设置为0,就无法激活小部件。我是缺少一些关键的东西,还是我以一种无效的方式构建了这个东西 我遇到的问题的基本思路如下:删除注释,它就会起作用: var router = new kendo.Router(); var mainLayout = new kendo.Layout($('#

我将剑道库升级到2014Q1框架,该框架有一些不错的功能,他们正在添加这些功能,但是当我这样做时,它完全破坏了任何小部件网格、tabStrip、选择列表等的渲染。我一直跟踪到布局/视图,如果不将setTimeout设置为0,就无法激活小部件。我是缺少一些关键的东西,还是我以一种无效的方式构建了这个东西

我遇到的问题的基本思路如下:删除注释,它就会起作用:

var router = new kendo.Router();
var mainLayout = new kendo.Layout($('#mainLayout').html());
var view = new kendo.View('sample', {
     wrap: false,
     model: kendo.observable({}),
     init: function() {
          // setTimeout(function(){
              $("#datepicker").kendoDatePicker();
          // }, 0);
     }
 });

 mainLayout.render('#container');

 router.route('/', function() {
     mainLayout.showIn('#app', view);
 });

 router.start();

诚然,我并不完全理解这一点,但希望这能有所帮助

基本上,当您尝试初始化datepicker时,视图元素还没有插入到DOM中。您可以在init函数中放置一个断点,当它命中时,检查DOM,您将看到应用程序是一个空div,并且datepicker不存在,至少在DOM上不存在

kendo.Layout.showIn似乎需要退出以使视图完成渲染,但当它初始化视图的元素时,它认为渲染已完成,并且init提前错误触发。setTimeout之所以有效,是因为它异步运行kendoDatePicker初始化,视图能够在timeout函数之前完成渲染

解决办法

从视图对象本身触发视图渲染:

var view = new kendo.View('sample', {
    init: function() {
        $("#datepicker").kendoDatePicker();
    }
});
router.route('/', function() {
    view.render('#app');
});
var view = new kendo.View('sample', {
    init: function() {
        view.element.find("#datepicker").kendoDatePicker();        
    }
});
router.route('/', function() {
    mainLayout.showIn('#app', view);
});
从视图对象本身中选择并查找日期选择器:

var view = new kendo.View('sample', {
    init: function() {
        $("#datepicker").kendoDatePicker();
    }
});
router.route('/', function() {
    view.render('#app');
});
var view = new kendo.View('sample', {
    init: function() {
        view.element.find("#datepicker").kendoDatePicker();        
    }
});
router.route('/', function() {
    mainLayout.showIn('#app', view);
});

接近底部是我对第二种选择的想法。也许其他人可以过来,对发生的事情给出更好的解释。

是的,我同意你的看法。我确实运行了一系列测试,得出了相同的结论,在实现上述解决方案之一或使用data role=datepicker之前,元素不存在。我确实喜欢view.element.find方法,但与setTimeout或使用数据角色初始化项目一样,当布局应该像2013 libs中那样为我们处理此问题时,该项目充其量是一个bandaid解决方案:。我会满足于在init顶部调用super以确保init安装代码完全运行。@JakeTheBraek同意,这充其量只是一个bandaid解决方案,除非这是一个有意的突破性更改。我发现的另一件奇怪的事情是,文档声称Layout.ShowIn将触发kendo.View的show事件。所以我尝试在show事件中初始化datepicker,但它甚至没有命中事件。是的,我也看到了,我假设它与init方法处于同一级别,将它扔进去,无法让它调用,就像你想象的隐藏一样。看起来整个布局管理器机制充其量只是事后才想到的。希望当我的公司开始为完全许可支付费用时,我能以更正式的身份得到这些问题的一些答案。我非常感谢您的帮助,尽管@gitsitgo知道我没有发疯总是很好: