2012-08-17 25 views
0

我使用的是Ext 4.1。我有关于与关联加载JSON数据的一些问题。平面数据完美加载,只有'hasMany'不起作用。 (如果装在那里无处可寻)。如果一条记录被加载,我希望能够获得2个Attendee商店和1个商店的文档。在Ext商店中加载JSON,缺失关联

我也可以改变JSON格式到一个更好的格式(如果您有任何建议,让我知道!)

我有this json data

这是我的第一个模型:

Ext.define('App.model.package.LabVisit', { 
    extend: 'Ext.data.Model', 
    requires: [ 
     'App.model.package.Attendee', 
     'App.model.package.Document' 
    ], 
    idProperty: 'labVisitID', 

    fields: [ 
     { 
      mapping: 'lab_visit_id', 
      name: 'labVisitID', 
      type: 'int' 
     }, 
     { 
      mapping: 'lab_id', 
      name: 'labID', 
      type: 'int' 
     }, 
     ... some more irrelevant... 
     { 
      mapping: 'comments', 
      name: 'comments' 
     }, 
     { 
      name: 'upddate' 
     } 
    ], 
    hasMany: [ 
     /* edit: added foreignKey (also tried with: lab_visit_id) */ 
     { model: 'package.Attendee', name: 'attendeeLabList', associationKey:'attendee_lab', foreignKey: 'labVisitId' }, 
     { model: 'package.Attendee', name: 'attendeeEmpList', associationKey:'attendee_emp', foreignKey: 'labVisitId' } 
     { model: 'package.Document', name: 'document', associationKey:'document' }, 
    ] 

}); 

我有以下与会者型号:

Ext.define('App.model.package.Attendee', { 
    extend: 'Ext.data.Model', 

    fields: [ 
     /* edit: added this field */ 
     { 
      mapping: 'lab_visit_id', 
      name: 'labVisitId' 
     }, 
     { 
      mapping: 'attendee_id', 
      name: 'AttendeeID' 
     }, 
     { 
      mapping: 'first_name', 
      name: 'firstName' 
     }, 
     { 
      mapping: 'last_name', 
      name: 'lastName' 
     }, 
     { 
      name: 'email' 
     } 
    ] 
}); 

以下文档模型:

Ext.define('App.model.package.Document', { 
    extend: 'Ext.data.Model', 

    fields: [ 
     { 
      mapping: 'document_id', 
      name: 'docID' 
     }, 
     { 
      mapping: 'document_name', 
      name: 'docName' 
     }, 
     { 
      mapping: 'document_mimetype', 
      name: 'mimeType' 
     }, 
     { 
      name: 'uploadID' 
     } 
    ] 
}); 

最后我的商店:

Ext.define('App.store.package.LabVisit', { 
    extend: 'Ext.data.JsonStore', 
    requires: [ 
     'App.model.package.LabVisit' 
    ], 

    constructor: function(cfg) { 
     var me = this; 
     cfg = cfg || {}; 

     me.callParent([Ext.merge({ 
      storeId: 'labVisitStore', 
      model: 'App.model.package.LabVisit', 
      remoteSort: true, 
      proxy: { 
       type: 'ajax', 
       api: { 
        read: API_URLS.getVisitList //url to the json 
       }, 
       reader: { 
        type: 'json', 
        root: 'rows' 
       } 
      } 
     }, cfg)]); 
    } 
}); 

编辑: 我已在模型中的外键,并把它添加到hasMany

仍然没有差异。这是我的输出:

the first record in the store

我也觉得奇怪:如果它坏我期待一个例外。而且有2家神秘店总是存在,但我不知道为什么或者目的是什么。

+1

与其他许多人一样,我相信你是ExtJS 4中关联混淆本质的受害者。你的代码的一个明显问题是'package.Attendee'模型没有链接它的(外键)模型'package.LabVisit'。如果你看看[文档示例](http://docs.sencha.com/ext-js/4-1/#!/api/Ext.data.association.HasMany),“产品”有'user_id'字段要完成有许多关联'User'的就有了它。换句话说,你的关联模型是无效的,无论加载情况如何都无法工作。 – Izhaki 2012-08-17 12:19:53

+0

@Izhaki我相信我是......这是我从一开始就在挣扎的东西。所以你说它只会在我添加一个'belongsTo'并将一个'labVisit_id'添加到'package.Attendee'模型时起作用... – VDP 2012-08-17 12:50:44

+0

不,你不需要'belongsTo',你只需要' 'package.Attendee'模型中的labVisit_id'。但是,这提出了一个问题,即参加者是否只能在一个实验室中访问 - 在我看来,有一个人的名单,你正试图将他们与labvisits联系起来。因此,多对多可能是这里的方式,但它不是ExtJS的一部分,尽管可以使用关联存储来轻松实现。 – Izhaki 2012-08-17 12:56:23

回答

0

的问题是在这个部分:

hasMany: [ 
    { model: 'package.Attendee', name: 'attendeeLabList', associationKey:'attendee_lab' }, 
    { model: 'package.Attendee', name: 'attendeeEmpList', associationKey:'attendee_emp' }, 
    { model: 'package.Document', name: 'document', associationKey:'document' }, 
] 

@Izhaki帮了我很多。感谢名单!特别是与小提琴。我从那里开始,一开始就用一块一块地切换代码。直到我看到模型是问题。

模式应该被定义是这样的:App.model.package.Attendee

我认为这是可悲的,该框架不显示显著错误/警告如果模型没有被识别/不excist /不提供。 ..但是,现在它起作用了。