7

私は、テキストメッセージのリストとメッセージを送信した関連ユーザーの名前を表示する基本的なSenchaTouchアプリケーションに取り組んでいます。モデルの関連付けを設定する方法についてオンラインでチュートリアルを実行しましたが、各チュートリアルでは、サーバーがネストされた構造でデータを生成することを前提としています。

私が扱っているデータは、主キーと外部キーの関係を持つフラットな構造であり、Senchaに単一の応答から両方のストアをロードさせる方法を理解できません。

model / User.js

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

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

store / Users.js

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

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

model / 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'
            }
        }
    }
});

store / 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."
    }]
}
4

1 に答える 1

1

私は実際にアソシエーションと協力したことがなく、リクエストに応じて2つのストアをロードするものを見つけるためにドキュメントを調べましたが、何も見つかりませんでした。だからこれが私がそれをする方法です:

モデル

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');
            }
          }
      )
    }]
  }
});

そして、あなたはこのようなものを手に入れるでしょう:

ここに画像の説明を入力してください

お役に立てれば。説明が必要な場合は、私に知らせてください。

于 2012-07-19T23:10:17.140 に答える