ExtJS的4如何包装容器的子组件中自定义HTML?(extjs 4 how to wrap chi

2019-10-30 02:08发布

我需要在我的ExtJS 4.2应用程序创建Twitter的引导基本的NavBar组件。 我只想让我的成分生成以下HTML:

<div class="navbar navbar-inverse navbar-fixed-top">
  <div class="navbar-inner">
    <ul class="nav">
      <li class="active"><a href="#"><i class="icon1"></i> Item #1</a></li>
      <li><a href="#"><i class="icon2"></i> Item #3</a></li>
      <li><a href="#"><i class="icon3"></i> Item #3</a></li>
    </ul>
  </div>
</div>

我创建了两个视图(的NavBar和NavBarItem相应地):

Ext.define('My.view.layout.Navbar', {
   extend: 'Ext.container.Container',
   xtype: 'navbar',
   cls: 'navbar navbar-inverse navbar-fixed-top',
   defaultType: 'navbaritem',
   initComponent: function() {
       Ext.apply(this, {
           items: [
               {
                   title: 'Item #1',
                   icon: 'icon1',
                   selected: true
               },
               {
                   title: 'Item #2',
                   icon: 'icon2'
               },
               {
                   title: 'Item #3',
                   icon: 'icon3'
               }
           ]
       });
       this.callParent(arguments);
   }
});

Ext.define('My.view.layout.NavbarItem', {
    extend: 'Ext.Component',
    xtype: 'navbaritem',
    autoEl: { tag: 'li' },
    config: {
        title: '',
        icon: null,
        selected: false
    },
    renderTpl: '<a href="#">{icon}{title}</a>',
    initComponent: function() {
        ....
        this.callParent(arguments);
    }
});

我得到这样的事情作为输出:

<div class="navbar navbar-inverse navbar-fixed-top">
   <li class="active"><a href="#"><i class="icon1"></i> Item #1</a></li>
   <li><a href="#"><i class="icon2"></i> Item #3</a></li>
   <li><a href="#"><i class="icon3"></i> Item #3</a></li>
</div>

如何修改,以便它可以有一个自定义模板和子组件可以被添加到一个特定的元素我的NavBar看法?

Answer 1:

你已经完成了一半:你的孩子资料的呈现或多或少正常,但容器将需要一些工作,以避免渲染额外的元素。 这里美中不足的是,对于一个容器中,渲染过程是紧密结合的布局,事实上集装箱从布局中呈现交织。 所以,你需要做傻事自动布局了一下:

Ext.define('My.view.layout.NavBar', {
    extend: 'Ext.container.Container',
    alias:  'widget.navbar',  // Not xtype here!

    defaultType: 'navbaritem',

    // Let's be declarative
    items: [{
        title: 'Item #1',
        icon: 'icon1',
        selected: true
    }, {
        title: 'Item #2',
        icon: 'icon2'
    }, {
        title: 'Item #3',
        icon: 'icon3'
    }],

    renderTpl: [
        '<div class="navbar-inner">',
            '<ul class="nav">',
                '{%this.renderChildren(out,values)%}',
            '</ul>',
        '</div>',

        {
            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);
                }
            }
        }
    ]
});

实例化这个容器会给你大约这样的输出:

<div ...>
    <div class="navbar-inner">
        <ul class="nav" ...>
            <li ...>
                <a href="#">...</a>
            </li>
            <li ...>
                <a href="#">...</a>
            </li>
            <li ...>
                <a href="#">...</a>
            </li>
        </ul>
    </div>
</div>

我在这里简化并呈现给DOM实际的元素会得到很多自动生成的类ID和其他属性的,所以你必须要更加调整你的模板,但我希望你得到它的要点。



文章来源: extjs 4 how to wrap children components of container in custom html?