3

ExtJS 模型字段具有映射选项。

fields: [
        {name: 'brandId', mapping:'brand.id',   type: 'int'},
        {name: 'brandName', mapping:'brand.name', type: 'string'},

问题是:如果来自服务器的响应不包含某些字段(在我的示例中为品牌字段)并且定义了来自内部字段的映射,则 Ext Store 会默默地加载任何记录。

有人对此有问题吗?这是某种错误吗?

更新 说清楚:假设我的模型中有十个字段。来自服务器的响应有九个字段,缺少一个。如果该字段没有嵌套映射(映射:'xyz'),一切正常 - 存储加载记录,该字段为空。但是,如果该字段必须从某个嵌套字段加载并且具有映射选项 - 存储无法加载任何内容。

更新 2 我找到了导致问题的代码。事实是:当 Ext 尝试从 Json 加载一些字段时,它会执行这样的检查

(source["id"] === undefined) ? __field0.defaultValue : source["id"]

但是当字段有映射选项(映射'brand.id')时,阅读器会这样做

(source.brand.id === undefined) ? __field20.defaultValue : source.brand.id

如果源没有品牌字段,则会导致错误。

如果您遇到与我相同的问题:您可以通过重载Ext.data.reader.Json的方法 createFieldAccessExpression来修复它

4

2 回答 2

2

我同意 Ext 应该只无法加载该字段,而不是整个记录。一个不是很好但应该有效的选项是使用一个mapping函数:

{
    name: 'brandId',
    mapping: function(data, record) {
        return data.brand && data.brand.id;
    }
}

我可能有错误的论点(我通过查看源代码发现这个功能存在),所以可能会在那里放置一个断点,看看如果它不能像这样工作有什么可用的。

于 2012-04-29T03:29:28.283 回答
0

我认为您是误解mappingnesting范式:这些是不可互换的。如果您在数据中定义嵌套,则结果必须具有相应的字段。

于 2012-04-30T08:34:43.023 回答