javascript - Dojo:如何创建包含布局小部件(边框容器)的小部件

标签 javascript design-patterns widget dojo

我想创建一个包含layoutWidget(例如BorderContainer)的小部件。

我通常创建小部件的方式是继承:

  • _WidgetBase
  • _TemplatedMixin
  • _WidgetsInTemplatedMixin

IE:

  define([
        "dojo/_base/declare", "dijit/_WidgetBase", "dijit/_TemplatedMixin", "dijit/_WidgetsInTemplateMixin"
    ],
    function(
        declare, _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin
    ) {
        return declare([_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin] ,{

            templateString: template,
            ...

不幸的是,根据 WidgetsInTemplateMixin :

The dijit._WidgetsInTemplateMixin mixin does not support adding layout widgets as children. In particular there are issues with startup() and resize() calls to the children.

我已经证实这确实存在布局问题。创建包含layoutWidget的可重用小部件的推荐方法是什么?

选项:

  • 继承自_LayoutWidget - 谁能推荐一个可以遵循的示例?

  • 继承 _WidgetBase、_TemplatedMixin 和 _WidgetsInTemplatedMixin 并解决调整大小和启动方面的问题。这就是我目前正在做的事情,但我担心它可能有多脆弱。我发现,如果我在小部件上创建调整大小方法并在布局上调用调整大小,那么一切都会按预期工作(到目前为止)。我预计这可能并不总是有效,并且可能会引入棘手的错误。

    • 其他?
<小时/>

总结:

为了封装和复用的目的,我想创建一个widget。该小部件需要包含一个布局小部件(在本例中为 BorderContainer)。执行此操作的标准模式是什么?

最佳答案

您可以使用以下代码片段作为引用:

<div>
    <div data-dojo-type="dijit.layout.BorderContainer" 
        data-dojo-props="design:'headline'"
        style="width: 100%;height:100%;border:0"
        data-dojo-attach-point="bc">
        <div class="shadow" data-dojo-type="dijit.layout.ContentPane" style="padding:0"
            data-dojo-props="region:'top'">
        ...
    </div>
    <div data-dojo-type="dijit.layout.ContentPane" 
      data-dojo-props="region:'center'" style="padding:0">
      <div data-dojo-type="dijit.layout.TabContainer"
        data-dojo-attach-point="...">

        <div data-dojo-type="dijit.layout.ContentPane"
          data-dojo-attach-point="..." 
          title="Tab1" selected=true>
            Tab 1</div>

        <div data-dojo-type="dijit.layout.ContentPane"
          data-dojo-attach-point="..." style="padding:0"
          title="Tab2">
          Tab 2</div>

      </div>    
    </div>
  </div>
</div>

您可以使用适当的 JavaScript 代码。确保正确使用declare.safeMixin(this, args)以及postCreate和启动。

此外,如果您遇到渲染问题,您可以使用边框容器的附着点来调整大小。本质上,在启动代码之后,放置以下代码片段:

//kludge: fix for the F12/window resize issue
resize: function () {
    this.bc.resize(arguments);//bc is the atttachpoint name of the BorderContainer
    this.inherited(arguments);
}

关于javascript - Dojo:如何创建包含布局小部件(边框容器)的小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23838590/

相关文章:

python - 删除 Jupyter Notebook 中涉及交互式小部件的同一单元格中过去的 Matplotlib 图

php - 在 wordpress 中更改小部件内的默认 HTML 标记

javascript - Express React 应用程序在本地运行,但在 heroku 部署时出现错误

java - 命令模式如何启用撤消?

javascript - 如果第二个子元素为空,jQuery 删除页面上的多个类

javascript - react 器模式在 Node.js 中是如何工作的?

c# - UI 管理框架 - 设计改进

php - Yii 2 字段 2 的值必须大于字段 1

javascript - 替代 setInterval 来更新 API 调用的值

javascript - Google reCAPTCHA v3 中的重复或超时错误消息是什么