【问题标题】:Loading associated data in Sencha Touch without nesting在 Sencha Touch 中加载关联数据而不嵌套
【发布时间】:2012-07-14 19:25:31
【问题描述】:

我正在开发一个基本的 Sencha Touch 应用程序,该应用程序显示文本消息列表和发送消息的关联用户的名称。我已经按照在线教程了解如何设置模型关联,但每个教程都假设服务器生成具有嵌套结构的数据。

我正在处理的数据具有具有主/外键关系的扁平结构,我无法弄清楚如何让 Sencha 从单个响应中加载两个存储。

模型/User.js

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

    config: {
        fields: [
            { name: 'uid', type: 'number' },
            { name: 'name', type: 'string' },
        ]
    }
});

存储/Users.js

Ext.define('App.store.Users', { 
    extend: 'Ext.data.Store',                                                    

    config: {                                                                    
        model: 'App.model.User',                                                 
        autoLoad: true,
    }
});

模型/Message.js

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

    config: {
        fields: [
            { name: 'id', type: 'number' },
            { name: 'uid', type: 'number' },
            { name: 'message', type: 'string' }
        ],

        associations: [{
            type: 'belongsTo',
            model: 'App.model.User',
            primaryKey: 'uid',
            foreignKey: 'uid'
        }],

        proxy: {
            type: 'jsonp',
            url: 'messages.json',

            reader: {
                type: 'json',
                rootProperty: 'req_messages'
            }
        }
    }
});

存储/Messages.js

Ext.define('App.store.Messages', {
    extend: 'Ext.data.Store',

    config: {
        model: 'App.model.Message',
        autoLoad: true,
    }
});

消息已由我的应用程序正确加载和显示(下面的 JSON 响应示例),但我无法弄清楚如何将关联的用户加载到商店中。这可以通过配置解决,还是我需要自定义阅读器?任何帮助表示赞赏!

示例 JSON

{
    "users": [{
        "uid": "1",
        "name": "John"
    }, {
        "uid": "3033",
        "name": "Noah"
    }],
    "req_messages": [{
        "id": "539",
        "uid": "1",
        "message": "my message"
    }, {
        "id": "538",
        "uid": "1",
        "message": "whoops"
    }, {
        "id": "534",
        "uid": "3033",
        "message": "I love pandas."
    }]
}

【问题讨论】:

    标签: sencha-touch sencha-touch-2


    【解决方案1】:

    我从来没有真正使用过关联,我通过文档试图找到可以根据请求加载两个商店的东西,但我找不到任何东西。所以我会这样做:

    型号

    Ext.define('App.model.User', {
        extend: 'Ext.data.Model',
    
        config: {
            fields: [
                'uid',
                'name'
            ]
        }
    });
    
    Ext.define('App.model.Message', {
        extend: 'Ext.data.Model',
    
        config: {
            fields: [
                'id',
                'message',
                'uid'
            ],
            associations: { type: 'hasOne', model: 'User', primaryKey: 'uid', foreignKey: 'uid'}
        }
    });
    

    商店

    Ext.define('App.store.Users', { 
        extend: 'Ext.data.Store',                                                    
    
        config: {                                                                    
            model: 'App.model.User',
            autoLoad: true,
    
            proxy: {
                type: 'ajax',
                url: 'http://www.titouanvanbelle.fr/test.json',
    
                reader: {
                    type: 'json',
                    rootProperty: 'users'
                }
            },
    
            listeners:{
              load:function(s,r,success,op){
                var msgs = JSON.parse(op.getResponse().responseText).req_messages;
                Ext.each(msgs, function(msg) {
                    Ext.getStore('Messages').add(Ext.create('App.model.Message',msg));
                });
              }
            }
        }
    });
    
    Ext.define('App.store.Messages', {
        extend: 'Ext.data.Store',
    
        config: {
            model: 'App.model.Message'
        }
    });
    

    列表

    Ext.define("App.view.Main", {
      extend: 'Ext.Panel',
    
      config: {
        fullscreen: true,
        layout:'fit',
        items: [{
          xtype:'list',
          store:'Messages',
          itemTpl: new Ext.XTemplate(
              '<tpl for=".">',
                '{[this.getUserName(values)]} : {message}',
              '</tpl>',
              {
                getUserName(v){
                  var s = Ext.getStore('Users'),
                      u = s.getAt(s.find('uid',v.uid));
                  return u.get('name');
                }
              }
          )
        }]
      }
    });
    

    你会得到这样的东西:

    希望这会有所帮助。如果您需要解释,请告诉我。

    【讨论】:

    • 我想要一个解决方案,以便在视图中我不必自己进行交叉引用。为什么关联不足以完成更简单的视图?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 2012-06-12
    • 1970-01-01
    • 2023-03-29
    • 2012-10-06
    • 1970-01-01
    • 2013-05-05
    相关资源
    最近更新 更多