【问题标题】:dijit embedded BorderContainer does not work inside templatedijit 嵌入式 BorderContainer 在模板内不起作用
【发布时间】:2017-01-17 14:18:24
【问题描述】:

我有一个嵌入的 BorderContainer,当标记在主页中时它可以正常工作。当我在带有模板的小部件内移动边框容器标记时,出现问题并且边框容器将其所有子项放在左上角彼此重叠。

这是一个显示问题的简约 sn-p: http://embed.plnkr.co/cngYmG6BMKcUxwKQy2Du/

当我使用 dojo 版本 1.12.1 在本地运行时也会发生同样的事情

你能告诉我我错过了什么吗?

【问题讨论】:

  • 存在高度问题,我认为这是由小部件声明性实例化引起的。您是否尝试过编程实例化?
  • 不,我没有尝试过编程实例化。我刚刚发现了一个 hack 作为解决方法;在 setTimeout 内的嵌入式 BorderContainer 上调用 resize() :embed.plnkr.co/VNDsd7iT82IqdIFQbaxy。但我宁愿不依赖它

标签: dojo dijit.layout


【解决方案1】:

你可以让它工作,但你必须自己将调整大小的请求转发到 BorderContainer。

要记住的一条规则是,如果 Dojo 布局小部件只有一个子小部件,它们将调用调整大小。如果有多个小部件,它不知道要给每个小部件多少空间,它会举起双手,由你来决定大小。

在您的模板中为 BorderContainer 指定一个附加点名称,其中包含 data-dojo-attachpoint="bc"。然后重载resize方法,转发resize请求。

isLayoutContainer: true,

resize: function(changeSize, resultSize) {
    this.inherited(arguments);        
    this.bc.resize(changeSize, resultSize);
}

这假设 BorderContainer 是唯一值得调整大小的东西,即占用您的小部件的所有空间。

由于您现在对您的孩子调用 resize,您的行为就像一个布局小部件,因此您还应该定义 isLayoutContainer,如图所示。调整大小 API 没有很好的文档记录,isLayoutContainer 甚至更少。如果没有它,您可能会在窗口大小更改时注意到无关的调整大小调用。

如果您稍后在边框容器上方或下方创建内容,则需要相应地调整 changeSize.w 和 changeSize.h。这在像myWidget.resize() 这样没有提供changeSize 和resultSize 的呼叫中变得更加困难,您必须使用当前大小或以其他方式计算出来。 dojo/dom-geometry 在这种情况下很有帮助。

【讨论】:

    【解决方案2】:

    dijit._WidgetsInTemplateMixin的文档中所述...

    dijit._WidgetsInTemplateMixin mixin 不支持将布局小部件添加为子小部件。尤其是对孩子的 startup() 和 resize() 调用存在问题。

    【讨论】:

    • Dojo/Dijit 中是否有另一种方法可以将标记拆分为更小的文件,可以包含布局小部件?
    • 据我所知没有任何支持。即使使用 bRIMOs 解决方案,您也可能会遇到“resize”事件问题——这可以通过丑陋的窗口 onresize 处理程序来克服。理想情况下,您必须 (a) 将所有布局装饰性地放在前面,或者 (b) 将小部件中的布局替换为标准的“响应式”设计。
    • @LewisM 是的,但程序化不需要调整大小事件!它被正确渲染了,不是吗?
    • 谢谢刘易斯。至于 a),在我的情况下并不适用,对于 b) 在 dojo/dijit 中对我有吸引力的是小部件,因为我正在尝试模拟桌面应用程序
    【解决方案3】:

    正如 lewis 提到的,这不支持 Layout 小部件作为 children , 我向您建议的是,通过在主脚本中实例化小部件来使用编程方法,如下所示:

    require(["dojo/_base/array", 
             'dojo/_base/declare',
             "dojo/parser", 
             "dojo/on", 
             "myapp/MyWidget", 
             "dijit/layout/ContentPane",
             "dijit/layout/BorderContainer", 
             'dojo/domReady!'], 
             function(array, declare, parser, on, MyWidget) {
                console.log("b4 parse ....") 
                parser.parse().then(function() {
                    console.log("after parse ...."); 
    
                    //create your widget here  
                    new MyWidget({}).placeAt("borderContainer3"); 
    
                }); 
             }
    );
    

    您可以在这里找到自定义的Plunker

    【讨论】:

    • 感谢 bRIMOs 的建议,布局工作正常,但是当我在 contentPanes 中添加其他内容时,模板有其他问题,我猜与生命周期有关
    猜你喜欢
    • 2010-12-16
    • 2023-03-23
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多