我需要在ExtJS 4.2应用程序中创建Twitter Bootstrap基本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视图,以便它可以有一个自定义模板,并且可以将子组件添加到特定元素中?
答案 0 :(得分:0)
您已经到了一半:您的子项目正在或多或少地呈现,但容器需要一些工作以避免渲染额外的元素。这里的问题是,对于容器,渲染过程与布局紧密地交织在一起,实际上容器从布局中呈现。所以你需要稍微捏一下自动布局:
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和其他属性,因此您必须更多地调整模板,但我希望您能获得要点它的。