按ID连接两个型号

时间:2014-04-20 13:54:03

标签: extjs

几天前我问了一个ExtJS问题,作为旁注,我也问过如何连接我的两个模型。主要答案得到了回答,但我仍然无法弄清楚我的另一个问题,所以我正在为它开启一个新问题。

这可能再次成为一个愚蠢的问题,但这里是:

我从服务器获得了一个JSON,如下所示:

{
"success": true,
"result": {
    "publishers": [
        {
          "id": "009999",
          "type": "ABC",
          "isReceipient": false,
          "description": "XYZ"
        },
        {
          "id": 45,
          "type": "ABC",
          "isReceipient": true,
          "description": "XYZ"
        },
        {
          "id": 45,
          "type": "ABC",
          "isReceipient": false,
          "description": ""
        }
        ],
        "notes": [
        {
          "publisherId": "009999",
          "text": "asdasd",
          "created": "2014-02-23T18:24:06.074Z"
        },
        {
          "publisherId": "46",
          "text": "asdasd",
          "created": "2014-02-23T18:24:06.074Z"
        },
        {
          "publisherId": 45,
          "text": "asdasd",
          "created": "2014-02-23T18:24:06.074Z"
        }
    ]
}
}

所以我得到了两个阵列,出版商和笔记。我有两个模型,我使用loadRawData()将它们加载到模型中,它可以工作,我在商店里收到了所有的发布者和笔记。 (他们都有商店 - 出版商和笔记)。但是我需要在笔记中使用publisherId来显示发布者描述。我尝试了许多使用google和sancha docs找到的东西:associations,hasmany,hasone,belongssto以及创建由两个聚合模型组成的第三个商店。到目前为止没有任何工作。

我想要的是拥有包含所有笔记的商店,以及所有笔记都有发布者信息。

我将复制下面的两个模型,你可以看到那里,评论我一直在尝试的东西。我也尝试过更改ID,名称等,以便更改这些内容。但我永远无法获得Notes以获得发布者的信息。

Ext.define('MA.model.Note', {
    extend: 'Ext.data.Model',
    fields: [
        'publisherId',
        'text' ,
        //hasone publisher
        {
            name: 'created',
            type: 'date',
            dateFormat: 'c'//'d-M-Y H:i:s' //"2014-02-23T18:24:06.074Z" needed: "02/23 18:24"
        }
    ]
    // hasOne: [
    //     {
    //         name: 'publisher',
    //         model: 'Publisher',
    //         associationKey: 'publisherId'
    //     }
    // ],

    // associations: [
    //     {
    //         type: 'hasOne',
    //         model: 'Publisher',
    //         primaryKey: 'id',
    //         foreignKey: 'publisherId'
    //     }
    // ]

    // associations : [
    //     {
    //         type           : 'hasOne',
    //         model          : 'MA.model.Publisher',
    //         getterName     : 'getPublisher',
    //         associatedName : 'User',
    //         associationKey : 'User'
    //     },
    //     {
    //         type           : 'belongsTo',
    //         model          : 'MA.model.Publisher',
    //         getterName     : 'getPublisher',
    //         associatedName : 'Publisher',
    //         associationKey : 'publisherId'
    //     }
    // ]

    // belongsTo: [
    //     {
    //         model: 'MA.model.Publisher',
    //         name: 'Note',
    //         primaryKey: 'publisherId',
    //         foreignKey: 'id',
    //         // foreignStore: 'Publishers'
    //     }
    // ]
});

出版商:

Ext.define('MA.model.Publisher', {
    extend: 'Ext.data.Model',

    idProperty: 'id',
    fields: [
        'id',
        'type' ,
        {
            name:'isReceipient',
            type:'boolean'
        },
        'description'
    ]
    // hasMany:  [
    //     {
    //         model: 'MA.model.Note',
    //         name: 'Note',
    //         primaryKey: 'id',
    //         foreignKey: 'publisherId',
    //         // foreignStore: 'Notes'
    //     }
    // ],
});

我是否走在正确的轨道上?我应该使用协会吗?我甚至无法真正理解关联和hasMan / One / belongsTo属性之间的区别,我想没有任何真正的,只是你声明它的方式。

编辑:我的想法是拥有一个DataView类,它有一个存储笔记的商店和相应的发布者。我有一个主要小组:

    items: [
        {
            xtype: 'create-note-panel',
            flex: 1
        },
        {
            xtype: 'notes-panel',
            store: 'Notes',
            flex: 1
        }
    ]

我的笔记小组看起来像这样:

Ext.define('MA.view.sections.notes.NotesPanel' ,{
    extend: 'Ext.DataView',
    alias: 'widget.notes-panel',
    // deferInitialRefresh: true,

    itemSelector: 'div.notes-list',
    tpl:  new Ext.XTemplate(
        '<div class="notes-list">',
            '<tpl for=".">',
                '<p>{created}, by {publisherId}</p>',
                '<p>{text}</p>',
                '<hr />',
            '</tpl>',
        '</div>'
    ),

    emptyText: 'No data available',
    initComponent: function() {
        var me = this,
            publisherStore = Ext.data.StoreManager.lookup('Publishers');
        //me.addEvents(   //just messing here, trying stuff
        //    'user-offer-activities'
        //);
        me.callParent(arguments);
    }
    //renderTo: Ext.getBody()

})
;

注意模板中的publisherId。我需要那里的出版商描述。我不想使用网格,因为这个DataView似乎是一个非常好的解决方案,我认为加入两个商店会很容易,我只是想不通它:(

1 个答案:

答案 0 :(得分:0)

我创造了一个小提琴,可以产生你所追求的东西(在视图中显示两个模型的数据)。

虽然这是一种漫长的方法,但由于tpl的工作方式,您无法访问模型,只能访问模型中的数据。所以我在tpl上创建了一个函数,它可以从基于publisherId的模型中获取我们感兴趣的记录。

https://fiddle.sencha.com/#fiddle/o9o

注意:我在不使用模型之间的任何关联的情况下创建了小提琴,但是您可以创建一个从Notes到Publisher的hasOne关联,并使用foreignKey链接相应模型中的id和publisherId(尽管我仍然没有&#39;我认为这可以让你直接在tpl中引用成员。