我想在组合框中为记录设置一个显示字段(这是一个历史数据并存储在数据库中并加载到表单上),该数据库中没有条目 .
例如,我在商店中有3个条目如下 - 值:显示字段a:apple b:ball c:cat
像往常一样,它用于预填充组合框(直到这里工作正常) .
我有一些存储在数据库中的历史数据,其中包含一些id为d的记录的值,这些记录在商店中不再存在,但我仍然希望支持旧数据,并希望显示相关的显示字段('doll')它 .
我的查询是,即使此记录不在与组合框关联的商店中,如何在从数据库获取记录时设置显示字段?目前,我们在extJs中没有诸如setDisplayField之类的方法,但是我们有一个方法'setValue'来改变组合框中的值,这是不希望的 .
我想在数据库中遇到'id = d'时将显示字段更改为'doll' .
请帮忙 .
谢谢
3 回答
如果你真正想要的是
setDisplayField
方法,实际上它存在并且它被称为setRawValue .然而,令人怀疑的是,它本身就足以解决您的问题 . 实际上,您可以使用它来获得正确的显示,但您将失去 Value ......
正如dbring建议的那样,将历史记录添加到组合商店中确实可以解决您的问题,当且仅当您愿意让用户选择历史记录时 . 在我的理解中并非如此,因为否则你不会有任何问题开始......
在检查了组合类的代码之后,我认为实现所需的最佳方法是覆盖findRecord方法 . 此方法返回的任何记录都将用于更新组合框显示及其值,而不管此记录是否存在于组合的存储中,并且不会影响可在组合中选择的值 . 完善!
让's say we' ve在我们的组合中添加
legacyStore
,这里是如何覆盖findRecord
方法来做到这一点:现在,我们还有另外几个问题要处理......
首先,如果在调用
findRecord
时没有加载旧存储怎么办?那不行 . 在其vanilla形式中,如果未加载其存储,组合框将中止其setValue
方法,并从其onLoad
方法调用它 . 我们应该添加一些代码来复制旧版商店的这种行为 .第二个问题更简单,但如果组合用历史值初始化,并且用户更改组合的值但后悔他们的选择怎么办?如果不取消并重新填写整个表格,他们将无法获得原始 Value . 为了避免这种挫败感,我们可以更改组合行为以在清除时恢复其原始值,而不是其最后一个值 . 由于我不知道这是否合适,我们会将其添加为选项 .
考虑到这一切,这里是处理您的特定用例的“ux”的完整代码 .
请注意,如果
forceSelection
设置为true
并且使用autoLoad: true
创建存储,则它包含一个错误的全局修复程序,该错误会终止组合框的初始值 . 有关this other question中的更多信息 . 或者,您可以跳过全局修复并将loading: true
添加到使用forceSelection: true
的组合的所有商店和旧版商店 .最后,这里有一个live demo,其中有很多例子证明这个ux适用于同步和异步存储的所有组合和
forceSelection
......而setRawValue
却没有 .我认为您可以通过创建Ext.XTemplate并将该模板设置为组合框上的displayTpl属性来实现此目的 . 然后在您的模板中,您可以使用一种方法来测试应以不同方式显示的记录 .
displayTpl配置没有记录,但如果您查看ComboBox Source Code并搜索 me.displayTpl ,您可以看到它们只是创建一个默认的displayTpl(如果不存在) .
您只需要在使用
store.add({id:'d',name:'doll'})
加载后将该记录添加到商店这是一个不是你需要的例子,但显示了这个概念: