ExtJS 4.1 - 检索嵌套 JSON 的 hasOne 信息

Posted

技术标签:

【中文标题】ExtJS 4.1 - 检索嵌套 JSON 的 hasOne 信息【英文标题】:ExtJS 4.1 - Retrieve hasOne information for Nested JSON 【发布时间】:2012-08-31 16:41:47 【问题描述】:

我正在尝试检索模型和包含 hasOne 关联的关联模型的信息。我引用了以下 Sencha 文档页面 (http://docs.sencha.com/ext-js/4-1/#!/guide/data)。我目前正在使用以下示例代码:

var Mtd = Ext.ModelMgr.getModel('Mtd');
 Mtd.load(4, 
     success: function(mtd)
         console.log("Loaded! " + mtd.get('id'));
         mtd.getTreatmentdesign(function(treatment,operation)
             console.log(treatment.get('id'));
         , this);
     
 );

现在,当我调用 mtd.getTreatmentdesign() 时,我注意到有两个请求用于检索信息。第一个是检索我期望的 Mtd 信息,但随后它也请求检索 Treatmentdesign 信息。 Mtd 的响应包含 Mtd 信息以及 Treatmentdesign 信息。所以我想通过一个请求来处理 Mtd 和 Treatmentdesign 信息。令我感到困惑的是,文档中的说明如下:

您可能想知道为什么我们将成功函数传递给 User.load 调用,但在访问用户的帖子和 cmets 时不必这样做。这是因为上面的示例假设当我们发出获取用户的请求时,服务器会返回用户数据以及所有嵌套的帖子和评论。通过像我们上面所做的那样设置关联,框架可以在单个请求中自动解析出嵌套数据。

那么我怎样才能在不发出另一个请求的情况下检索相关信息呢?我只是想使用单个请求中的所有 json,而不是必须发出多个请求。

【问题讨论】:

【参考方案1】:

确保将HasOne 关联上的associationKey 配置设置为包含关联模型数据的属性。默认情况下,这是所有小写字母的关联模型类的名称。

例如,如果Mtd 记录的数据由服务器以表单形式返回


    ...
    treatmentDesign: 
       ...
    

associationKey 设置为'treatmentDesign'

下面是一个实际例子:http://jsfiddle.net/HP6fq/3/

【讨论】:

【参考方案2】:

是的,associationKey 有效

Ext.define('User', 
    extend:'Ext.data.Model',
    fields: ['id', 'name', 'status'],
    associations: [ type: 'hasOne', model: 'Status', associationKey: 'status'  ]
);

Ext.define('Status', 
    extend:'Ext.data.Model',
    fields: ['id', 'title'],
);

Demo here

【讨论】:

以上是关于ExtJS 4.1 - 检索嵌套 JSON 的 hasOne 信息的主要内容,如果未能解决你的问题,请参考以下文章

ExtJS 4.1 TreeStore 中的不同节点类型

将自定义 JSON 解析为 ExtJS 4.1 TreeStore

extjs 嵌套 json

EXTJS 4 嵌套 json 数组数据到网格面板

如何在 Extjs 4 中使用嵌套的 JSON 填充表单

ExtJS 在网格中加载嵌套的 JSON 数据