【问题标题】:extjs store failextjs 存储失败
【发布时间】:2012-05-08 06:01:19
【问题描述】:

ExtJS 模型字段有映射选项。

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

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

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

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

更新 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

来修复它

【问题讨论】:

  • 如果商店未能在响应中找到它的记录,您会期待什么其他行为?我的意思是,你对这种行为有什么问题?
  • 嗯,记录来自服务器,只是没有“品牌”字段。如果一条记录遗漏了某个字段并且没有映射,一切正常,商店加载记录,该字段为空
  • "(在我的示例中为品牌字段)" 您没有在此处显示品牌字段。你有一个brandId 和brandName。请澄清。
  • 模型中没有品牌字段,但服务器响应中应该有品牌字段 "brand":{"id":"1","name":"Hyundai"} 我清楚了吗?
  • "The Store 静默加载任何记录失败"只是因为它无法确定服务器中brand 的实际数据是什么(响应中没有收到brand,所以怎么能商店获取brand.id 和brand.name)。如果brand 未确定,商店如何知道该字段是否与服务器上的实际数据相比已更改以进行更新。所以这种情况下的事件处理是不可能的。

标签: extjs extjs4 store extjs4.1


【解决方案1】:

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

【讨论】:

  • 是的,事实证明它是这样工作的,但文档没有说明它,我认为这是不正确的行为。
【解决方案2】:

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

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

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

【讨论】:

  • 仅供参考,这是一个设计决定,数据读取可能会很慢,因此在使用一些“复杂”json 表达式的情况下必须有一个 try catch 块并不理想。跨度>
  • 也许 Ext 可以像我在这个回复中所做的那样,使用“&&”分隔的点路径,所以如果它不存在,你会得到false
  • 好主意,BigSean。但我选择了“try ... catch ...”块。
猜你喜欢
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 2022-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
相关资源
最近更新 更多