【问题标题】:Extjs 4.2.2 Create Dynamic Unordered List containing Ext ComponentsExtjs 4.2.2 创建包含 Ext 组件的动态无序列表
【发布时间】:2015-05-01 19:07:38
【问题描述】:

我试图通过定义从Ext.container.Container 扩展的类来在Ext 4.2.2 中创建基本ul

理想情况下,我希望我的渲染标记类似于:

<ul>
    <li>
        {any Ext component here}
    </li>
    ...
</ul>

我知道我在当前的实现中遗漏了一些基于 Alex Tokarev 的回答:extjs 4 how to wrap children components of container in custom html?

Ext.define('MyUnorderedList', {
    extend: 'Ext.container.Container',

    requires: [
        'MyListItem'
    ],

    alias: 'widget.ul',

    defaultType: 'li',

    autoEl: 'ul',

    renderTpl: [
        '{%this.renderChildren(out,values)%}',
        {
            renderChildren: function(out, renderData) {
                // We have to be careful here, as `this`
                // points to the renderTpl reference!
                var me = renderData.$comp.layout,
                    tree = me.getRenderTree();

                if (tree) {
                    Ext.DomHelper.generateMarkup(tree, out);
                }
            }
        }
    ]
});

Ext.define('MyListItem', {
    extend: 'Ext.container.Container',

    alias: 'widget.li',

    autoEl: 'li',

    renderTpl: [
        '{%this.renderChildren(out,values)%}',
        {
            renderChildren: function(out, renderData) {
                // We have to be careful here, as `this`
                // points to the renderTpl reference!
                var me = renderData.$comp.layout,
                    tree = me.getRenderTree();

                if (tree) {
                    Ext.DomHelper.generateMarkup(tree, out);
                }
            }
        }
    ]
});

上面确实呈现了适当的 HTML,但是在尝试实现它时我不断收到以下错误: Uncaught TypeError: Cannot read property 'dom' of null 引用了从Ext.layout.Layout.moveItem 调用的以下函数:

target = target.dom || target;

又来自renderItemsrenderChildren

基本上,我对这件事束手无策,希望对我所缺少的东西提出一些建议。

[编辑] 如果处理此问题的正确方法是使用自定义布局,我将非常感谢您指出正确的方向。

【问题讨论】:

  • 也许可以尝试为此创建自定义布局
  • 自定义布局是要走的路吗?暴露 renderTpl 有什么意义?

标签: extjs extjs4 extjs4.2


【解决方案1】:

CD.. 这是一个正确的实现吗?我很难找到关于这类事情的一些像样的文档。

Ext.define('MyApp.layout.None', {
    extend: 'Ext.layout.container.Container',

    alias: 'layout.nolayout',

    reserveScrollbar: false,
    managePadding: false,

    usesContainerHeight: false,
    usesContainerWidth: false,
    usesHeight: false,
    usesWidth: false,

    childEls: [],

    renderTpl: [
        '{%this.renderBody(out,values)%}'
    ],

    setupRenderTpl: function (renderTpl) {
        var me = this;

        renderTpl.renderContainer = me.doRenderContainer;
        renderTpl.renderItems = me.doRenderItems;
    },

    calculate: function(ownerContext) {
        //needs to be here as a placeholder
    }
});

Ext.define('MyApp.container.ListItem', {
    extend: 'Ext.container.Container',

    requires: [
        'MyApp.layout.None'
    ],

    layout: 'nolayout',

    alias: 'widget.li',

    autoEl: 'li'
});

Ext.define('MyApp.container.UnorderedList', {
    extend: 'Ext.container.Container',

    requires: [
        'MyApp.container.ListItem',
        'MyApp.layout.None'
    ],

    layout: 'nolayout',

    alias: 'widget.ul',

    defaultType: 'li',

    autoEl: 'ul'
});

【讨论】:

  • 当然,这似乎破坏了我的其余布局。我正在使用它来创建一个附加到卡片布局的导航栏(停靠顶部),不幸的是,这种布局导致卡片布局的主体高度为零。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 1970-01-01
  • 1970-01-01
  • 2014-01-01
相关资源
最近更新 更多