2012-07-15 8 views
7

Ich arbeite an einer grundlegenden Sencha Touch-Anwendung, die eine Liste von Textnachrichten und den Namen eines zugeordneten Benutzers, der die Nachricht gesendet hat, anzeigt. Ich habe die Online-Tutorials zum Einrichten von Modellassoziationen verfolgt, aber in jedem Lernprogramm wird davon ausgegangen, dass der Server Daten mit einer verschachtelten Struktur erstellt.Laden zugehöriger Daten in Sencha Touch ohne Verschachtelung

Die Daten mit denen ich arbeite haben eine flache Struktur mit Primär-/Fremdschlüsselbeziehungen, und ich kann nicht herausfinden, wie Sencha erhält aus einer einzigen Reaktion beiden Geschäfte zu laden.

Modell/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, 
    } 
}); 

Modell/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, 
    } 
}); 

Die Nachrichten werden durch meine Anwendung (Probe JSON Antwort unten) korrekt geladen und angezeigt, aber ich kann nicht herausfinden, wie die zugehörigen Benutzer in den Laden geladen werden zu bekommen. Kann dies mit einer Konfiguration gelöst werden, oder brauche ich einen benutzerdefinierten Leser? Jede Hilfe wird geschätzt!

Beispiel 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." 
    }] 
} 
+0

Hat es funktioniert? –

Antwort

1

ich nie wirklich mit den Verbänden gearbeitet habe und ich ging durch das Dokument, etwas zu finden, um zu versuchen, die zwei Geschäfte mit auf Anfrage laden würde, aber ich konnte nichts finden. Also hier ist, wie ich es tun würde:

Modell

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

Stores

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

Liste

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

enter image description here

hoffe, das hilft:Und Sie haben so etwas wie dieses. Wenn Sie eine Erklärung brauchen, lassen Sie es mich wissen.

+1

Ich hätte gerne eine Lösung, damit ich den Querverweis nicht selbst machen muss. Warum reichen die Assoziationen nicht aus, um eine einfachere Sichtweise zu erreichen? –

+0

Ich habe immer noch keinen Weg gefunden, es zu tun ... –