【问题标题】:Dojo/Dijit TitlePaneDojo/Dijit TitlePane
【发布时间】:2011-11-18 20:04:54
【问题描述】:

如何使 titlePane 的高度动态化,以便在页面加载后将内容添加到窗格中时,TitlePane 会展开?

【问题讨论】:

  • 嗯,我认为这是默认行为。小提琴:jsfiddle.net/RxybY
  • 没有。我有在页面加载时填充的 ContentPane 并将其下方的内容推到视野之外
  • 刚试过fiddle。一定是我在做什么!?!
  • 嗯,很奇怪。您可以在 jsfiddle 中重现该问题,或者以其他方式分享一些代码吗?
  • 在jsfiddle左侧输入“库标签属性”添加djConfig="parseOnLoad:true"

标签: dojo dijit.layout


【解决方案1】:

布局小部件有一个.resize() 方法,您可以调用该方法来触发重新计算。大多数时候您不需要自己调用它(如 cmets 中的示例所示),但在某些情况下您别无选择。

【讨论】:

    【解决方案2】:

    看起来富内容编辑器是一个异步加载的 iframe,会混淆初始布局。

    正如@missingno 提到的,resize 函数是您想要查看的。

    如果您在your page 上执行以下函数,您可以看到它确实正确地调整了所有内容:

    //iterate through all widgets
    dijit.registry.forEach(function(widget){
        //if widget has a resize function, call it
        if(widget.resize){
            widget.resize()
        }
    });
    

    上述函数遍历所有小部件并调整所有小部件的大小。这可能是不必要的。我认为您只需要在 dijit.Editor 初始化之后在每个与布局相关的小部件上调用它。

    在实际页面上执行此操作的最简单方法可能是将其添加到您的 addOnLoad 函数中。例如:

        dojo.addOnLoad(function() {
            dijit.byId("ContentLetterTemplate").set("href","index2.html");
            //perform resize on widgets after they are created and parsed.
            dijit.registry.forEach(function(widget){
                  //if widget has a resize function, call it
                  if(widget.resize){
                      widget.resize()
                  }
            });
        });
    

    编辑:该问题的另一个可能解决方法是将内容窗格上的 doLayout 属性设置为 false。默认情况下,所有 ContentPane(包括 TitlePane 和 dojox.layout.ContentPane 等子类)都将此属性设置为 true。这意味着 ContentPane 的大小是预先确定的并且是静态的。通过将doLayout 属性设置为false,ContentPanes 的大小将随着内容的变大或变小而自然增长。

    【讨论】:

    • 你说得对!我剪切并粘贴它,它在页面上工作。然后我在本地尝试了它,它没有:(所以我已经从本地复制到页面但它没有(查看调整大小按钮)
    • 您是否尝试将调整大小功能添加到 addOnLoad 方法? (见编辑)
    • 我只能在主页中使用 addOnLoad 函数,因为它在窗格内的页面中似乎不起作用。我在页面上尝试了很多东西,现在它崩溃了(很多递归)。我只需要真正调整LetterTemplateTitlePaneContentLetterTemplate 的大小。页面加载时请从第一个下拉菜单中选择Invoice Letter,只有执行此操作后才需要调整TitlePane的大小
    • 在这种情况下,您可以使用 dojo.connect 连接到 Invoice Letter 下拉列表的 onChange 事件,以在显示 letterVariablesContainer ContentPane 后调用调整大小
    • 不能这样做,因为onChange 替换了 onChange 事件所在的页面(如果你明白我的意思)
    【解决方案3】:

    我已经做了一个示例,如何在窗格打开后加载数据并构建窗格的内容。

    困扰我的是创建网格后,我必须先将其放入 DOM,然后再放入标题窗格,否则标题窗格将无法获得适当的高度。应该有更清洁的方法来做到这一点。

    查看:http://jsfiddle.net/keemor/T46tt/2/

    dojo.require("dijit.TitlePane");
    dojo.require("dojo.store.Memory");
    dojo.require("dojo.data.ObjectStore");
    dojo.require("dojox.grid.DataGrid");
    dojo.ready(function() {
        var pane = new dijit.TitlePane({
            title: 'Dynamic title pane',
            open: false,
            toggle: function() {
                var self = this;
                self.inherited('toggle', arguments);
                self._setContent(self.onDownloadStart(), true);
                if (!self.open) {
                    return;
                }
                var xhr = dojo.xhrGet({
                    url: '/echo/json/',
                    load: function(r) {
                        var someData = [{
                            id: 1,
                            name: "One"},
                        {
                            id: 2,
                            name: "Two"}];
    
                        var store = dojo.data.ObjectStore({
                            objectStore: new dojo.store.Memory({
                                data: someData
                            })
                        });
                        var grid = new dojox.grid.DataGrid({
                            store: store,
                            structure: [{
                                name: "Name",
                                field: "name",
                                width: "200px"}],
                            autoHeight: true
                        });
                        //After inserting grid anywhere on page it gets height
                        //Without this line title pane doesn't resize after inserting grid                                                            
                        dojo.place(grid.domNode, dojo.body());
                        grid.startup();
                        self.set('content', grid.domNode);
                    }
                });
            }
        });
        dojo.place(pane.domNode, dojo.body());
        pane.toggle();
    });​
    

    【讨论】:

      【解决方案4】:

      我的解决方案是将innerWidget.startup() 移动到"toggle" 的后续建议中。

      titlePane.aspect = aspect.after(titlePane, 'toggle', function () {
          if (titlePane.open) {
              titlePane.grid.startup();
              titlePane.aspect.remove();
          }
      });
      

      请参阅dojo/aspect reference documentation 了解更多信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多