Dojo / Dijit TitlePane

时间:2011-09-16 16:05:50

标签: dojo dijit.layout

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

4 个答案:

答案 0 :(得分:3)

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

正如@missingno所提到的,调整大小功能是你想看的。

如果您在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的大小将随着内容变大或变小而有机增长。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

我已经举例说明了如何在窗格打开后加载数据并构建窗格内容。

困扰我的是在创建网格之后,我必须首先将其放入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();
});​

答案 3 :(得分:1)

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

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

有关详细信息,请参阅dojo/aspect reference documentation