ExtJS问题与布尔数据和网格列列表过滤器以及Ext.Data.Store



我使用的是ExtJS 6(尽管据我所知它也适用于7.4版本),我有一个布尔列xtype的网格。对于那个布尔列,我想使用筛选列表选项。是的,我知道有一个布尔过滤器选项,但我不喜欢它是如何使用单选按钮工作的。我希望能够通过复选框选择Yes或No,但是我发现只有true作为值的选项有效。这是我的专栏配置:

{
header: 'Active'
, dataIndex: 'inactive'
, xtype: 'booleancolumn'
, trueText: 'No'
, falseText: 'Yes'
, filter:{
type: 'list',
options: [[true,"No"],[false, "Yes"]]
}
}

当排除'options'属性并让它顺便从存储中获取数据时,这不起作用。在查看完代码后,我发现它采用"options"配置并使用它作为数据创建自己的Ext.Data.Store。下面是一个可以运行的简单示例,它会出现相同的问题:

var teststore =  new Ext.data.Store({
fields: [
'id',
'text'
],
data: [[true,"No"],[false, "Yes"]]
});

问题是,'false'布尔值被改变,并被替换为动态创建的通用id。我发现问题出在Ext.data的构造函数中。

if (!(me.id = id = data[idProperty]) && id !== 0) {

如果该行的计算结果为true,它将用生成的id替换该id。为了解决这个问题,我只添加了'&&== false'到if语句的末尾,这就解决了这个问题。

我还没有完全测试过这一点,但是逻辑似乎是合理的,看起来与'0'的值发生了相同类型的问题,因此' &&id ! = = 0">. 因为我们是从sencha论坛来的,所以我想把这个提出来,以防它对某人有帮助。

既然我的帖子已经有了答案,我会发布一个更好的方法来做到这一点,而不是直接改变Ext代码文件(无论这是正确的方式,我可能是错的)。相反,您可以创建一个需要包含在应用程序中的新js文件(您可以将其命名为ext-override .js)。在新的js文件中,你只需要输入:

Ext.override(Ext.data.Model, {
constructor: function(data, session) {
.....
}
}

然后,您将从ExtJS版本的代码中复制构造函数代码,其中'..... . js'是(如果可能构造函数的参数是不同的,你将不得不更新这些),只是添加建议的变化,我在上面的'问题'。在Extjs代码中搜索Ext.define('Ext.data.Model'可以很容易地找到它,然后滚动到构造函数

最新更新