ExtJS模型字段具有映射选项。
fields: [
{name: 'brandId', mapping:'brand.id', type: 'int'},
{name: 'brandName', mapping:'brand.name', type: 'string'},
问题是:如果来自服务器的响应不包含某些字段(我的示例中的品牌字段)并且定义了内部字段的映射,则Ext Store将无法加载任何记录。
有人有问题吗?这是某种错误吗?
更新 为了说清楚:假设我的模型中有十个字段。来自服务器的响应有九个字段,一个丢失。如果此字段没有嵌套映射(映射:'x.y.z'),则一切正常 - 存储加载记录,该字段为空。但是,如果必须从某个嵌套字段加载此字段并具有映射选项 - 存储无法加载ANYTHING。
更新2 我找到了导致问题的代码。事实是:当Ext尝试从Json加载一些字段时,它会执行这样的检查
(source["id"] === undefined) ? __field0.defaultValue : source["id"]
但是当字段有映射选项(映射'brand.id')时,Reader会这样做
(source.brand.id === undefined) ? __field20.defaultValue : source.brand.id
如果来源没有品牌字段,会导致错误。
如果您遇到与我相同的问题:您可以通过重载 Ext.data.reader.Json 的方法 createFieldAccessExpression
来修复它答案 0 :(得分:2)
我同意Ext应该只加载该字段,而不是整个记录。一个不太好但应该有用的选项是使用mapping
函数:
{
name: 'brandId',
mapping: function(data, record) {
return data.brand && data.brand.id;
}
}
我可能有错误的参数(我通过查看源代码发现这个功能存在),所以可能会在那里放一个断点,看看有什么可用,如果它不能像这样工作。
答案 1 :(得分:0)
我认为你错误地解释了mapping
和nesting
范例:这些是不可互换的。
如果在数据中定义嵌套,结果必须具有相应的字段。