dijit嵌入式BorderContainer在模板内部不起作用

时间:2017-01-17 14:18:24

标签: dojo dijit.layout

我有一个嵌入的BorderContainer,当标记在主页面内时可以正常工作。当我使用模板移动窗口小部件内的边框容器标记时,出现问题,边框容器将其所有子项放在左上角的顶部。

这是一个显示问题的简约代码段: http://embed.plnkr.co/cngYmG6BMKcUxwKQy2Du/

当我使用dojo版本1.12.1

在本地运行时,会发生同样的事情

请告诉我我错过了什么?

3 个答案:

答案 0 :(得分:1)

您可以使用此功能,但您必须自行将调整大小请求转发给BorderContainer。

要记住的一条规则是,如果Dojo布局小部件具有单个子窗口小部件,则会调用resize。如果有多个小部件,它不知道给每个小部件留出多少空间,请举手向上,并由您决定尺寸。

为模板中的BorderContainer指定一个带有data-dojo-attachpoint="bc"的附加点名称。然后重载resize方法并转发resize请求。

isLayoutContainer: true,

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

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

由于您现在正在调用孩子的大小调整,因此您的行为类似于布局小部件,因此您还应该如图所示定义isLayoutContainer。调整大小的API没有很好地记录,而且isLayoutContainer甚至更少。如果没有它,您可能会在窗口大小发生变化时注意到无关的调整大小调用。

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

答案 1 :(得分:0)

正如https://jira.spring.io/browse/AMQP-666 ...

的文件中所述
  

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

答案 2 :(得分:0)

作为刘易斯提到这不支持布局小部件作为孩子, 我建议你使用程序化方法,通过在主脚本中实例化小部件,如下所示:

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