无法通过绑定到 Ext.js 中的数据 属性 来有条件地隐藏选项卡 6
Unable to conditional hide tab by binding to data property in Ext.js 6
我有一个选项卡面板,我在第一个选项卡上捕获购物车,在第二个选项卡上捕获付款信息,并在第三个选项卡上显示摘要。
如果购物车总数为 0,我想隐藏第二个选项卡。
我 运行 遇到的问题是,当我尝试绑定到确定用于隐藏选项卡的布尔值的公式时,选项卡不会隐藏。
Ext.define('TestPanel',{
extend: 'Ext.tab.Panel',
xtype: 'testpanel',
title: 'Test Panel',
viewModel:{
data:{
cartTotal: 0
},
formulas:{
hideTabTwo: function(get){
return get('cartTotal') == 0 ? true : false
}
}
},
items:[
{
title: 'Tab 1',
items:[
{
xtype: 'textfield',
bind:{
value: '{cartTotal}'
}
},
{
bind:{html:'Cart Total: {cartTotal}'}
},
{
bind:{
html: 'Hide Tab 2: {hideTabTwo}'
}
}
]
},
{
title: 'Tab 2',
html: 'omg',
bind:{
hidden: '{hideTabTwo}'
}
},
{
title: 'Tab 3',
html: 'lol'
}
]
})
Ext.application({
name : 'Fiddle',
launch : function() {
Ext.create('TestPanel',{
renderTo: Ext.getBody()
})
}
});
我看不出这里出了什么问题。如果您查看 fiddle 中行 html: 'Hide Tab 2: {hideTabTwo}'
的输出,您会发现它在 true 和 false 之间切换。
有什么想法吗?
是的,我有一个想法。为了验证它,我在选项卡 1 中添加到您的 fiddle:
{
xtype: 'textfield',
bind:{
hidden: '{hideTabTwo}'
}
},
结果是毁灭性的:绑定在 textfield 上正常工作,但在 tab 上不正确。
这是为什么?
我记得至少从 4.2.1 开始在 ExtJS 中就存在一个问题,它不是关于 bind
,而是关于制表符。在我自己的代码中,根本不使用 bind,我写了这样的东西:
items.each(function(item) {
var hideItem = ...
item.setHidden(hideItem);
if(item.tab) item.tab.setHidden(hideItem); // hide tab!
});
我记得我在 2014 年初将此作为错误提交到 Sencha 论坛中。
请同时在 Sencha 论坛中提交错误报告,以提高现有工单的优先级。请记住,他们没有在两年内解决这个问题,所以不要指望他们能快速解决问题。
我无法完全解决您的问题,我会再尝试一些,如果成功了,我会通知您。截至目前,我正在使用选项卡上的侦听器,但我没有找到在创建选项卡之后但在激活项目之前触发的侦听器:
listeners:{
boxready:function(me) {
console.log(me);
me.tab.setConfig({
bind:{
hidden: '{hideTabTwo}'
}
});
}
}
我发布了 this same question to Sencha's forums 并且有用户指出了正确答案。
我的代码和他的代码之间的区别在于,第二个选项卡到 hidden
属性 的绑定需要包含在 tabConfig
属性 中选项卡:
{
title: 'Tab 2',
html: 'omg',
tabConfig:{
bind:{
hidden: '{hideTabTwo}'
}
}
}
看到他的解决方案后,我回到 Ext.tab.Panel
上的文档,它在 controlling tabs 部分下有注释。
我找错了地方(Ext.tab.Tab
的文档中没有提到 tabConfig
也无济于事:/)。
我有一个选项卡面板,我在第一个选项卡上捕获购物车,在第二个选项卡上捕获付款信息,并在第三个选项卡上显示摘要。
如果购物车总数为 0,我想隐藏第二个选项卡。
我 运行 遇到的问题是,当我尝试绑定到确定用于隐藏选项卡的布尔值的公式时,选项卡不会隐藏。
Ext.define('TestPanel',{
extend: 'Ext.tab.Panel',
xtype: 'testpanel',
title: 'Test Panel',
viewModel:{
data:{
cartTotal: 0
},
formulas:{
hideTabTwo: function(get){
return get('cartTotal') == 0 ? true : false
}
}
},
items:[
{
title: 'Tab 1',
items:[
{
xtype: 'textfield',
bind:{
value: '{cartTotal}'
}
},
{
bind:{html:'Cart Total: {cartTotal}'}
},
{
bind:{
html: 'Hide Tab 2: {hideTabTwo}'
}
}
]
},
{
title: 'Tab 2',
html: 'omg',
bind:{
hidden: '{hideTabTwo}'
}
},
{
title: 'Tab 3',
html: 'lol'
}
]
})
Ext.application({
name : 'Fiddle',
launch : function() {
Ext.create('TestPanel',{
renderTo: Ext.getBody()
})
}
});
我看不出这里出了什么问题。如果您查看 fiddle 中行 html: 'Hide Tab 2: {hideTabTwo}'
的输出,您会发现它在 true 和 false 之间切换。
有什么想法吗?
是的,我有一个想法。为了验证它,我在选项卡 1 中添加到您的 fiddle:
{
xtype: 'textfield',
bind:{
hidden: '{hideTabTwo}'
}
},
结果是毁灭性的:绑定在 textfield 上正常工作,但在 tab 上不正确。
这是为什么?
我记得至少从 4.2.1 开始在 ExtJS 中就存在一个问题,它不是关于 bind
,而是关于制表符。在我自己的代码中,根本不使用 bind,我写了这样的东西:
items.each(function(item) {
var hideItem = ...
item.setHidden(hideItem);
if(item.tab) item.tab.setHidden(hideItem); // hide tab!
});
我记得我在 2014 年初将此作为错误提交到 Sencha 论坛中。
请同时在 Sencha 论坛中提交错误报告,以提高现有工单的优先级。请记住,他们没有在两年内解决这个问题,所以不要指望他们能快速解决问题。
我无法完全解决您的问题,我会再尝试一些,如果成功了,我会通知您。截至目前,我正在使用选项卡上的侦听器,但我没有找到在创建选项卡之后但在激活项目之前触发的侦听器:
listeners:{
boxready:function(me) {
console.log(me);
me.tab.setConfig({
bind:{
hidden: '{hideTabTwo}'
}
});
}
}
我发布了 this same question to Sencha's forums 并且有用户指出了正确答案。
我的代码和他的代码之间的区别在于,第二个选项卡到 hidden
属性 的绑定需要包含在 tabConfig
属性 中选项卡:
{
title: 'Tab 2',
html: 'omg',
tabConfig:{
bind:{
hidden: '{hideTabTwo}'
}
}
}
看到他的解决方案后,我回到 Ext.tab.Panel
上的文档,它在 controlling tabs 部分下有注释。
我找错了地方(Ext.tab.Tab
的文档中没有提到 tabConfig
也无济于事:/)。