2011-10-09 11 views
8

Bütün gece bunu anlamaya çalışıyorum ama boşuna.Sencha Touch Data Modeliyle yuvalanmış JSON yapısı nasıl okunur?

 

    { 
     "parents":{ 
      "parent":[ 
      { 
       "parentId":1, 
       "children":{ 
        "child":[ 
         { 
          "childId":1, 
         }, 
         { 
          "childId":2, 
         } 
        ] 
       } 
      }, 
      { 
       "parentId":2, 
       "children":{ 
        "child":[ 
         { 
         "childId":1, 
         }, 
         { 
         "childId":2, 
         } 
        ] 
       } 
      } 
      ], 
      "pageNum":1, 
      "pageSize":2 
     } 
    } 

Ancak, veri modelleri için doğru yapısı ne olması gerektiğini bilemiyorum: (bu yüzden onun yapısını değiştiremez başka bir sistemden geliyor) aşağıdaki gibi bir JSON yapıya sahiptir. Aşağıdakileri denedim ama işe yaramıyor. BTW, ebeveyn bilgilerine erişebilirim. Mesele çocuk bilgisine erişmektir. Yani, ilişki verilerini nasıl kurduğumda bir sorun var sanırım.

 

    Ext.regStore('ParentModelStore', { 
     model: 'ParentModel', 
     autoLoad:true 
    }); 

Bana ebeveyn bilgisini alır Aşağıdaki şablonu kullanıyorum, ancak ondan çocuk verilerini alamıyorum:

 

    myapp.views.ParentView = Ext.extend(Ext.Panel, { 
     layout: 'card', 

     initComponent: function() { 
      this.list = new Ext.List({ 
       itemTpl: new Ext.XTemplate(
        '<tpl for=".">', 
         '<div>', 
          '{parentId}', // this works fine 
         '</div>', 
         '<tpl for="children.child">', // this doesn't work 
           {childId} 
         '</tpl>', 
        '</tpl>', 
       ), 
       store: 'ParentStore', 
      }); 

      this.listpanel = new Ext.Panel({ 
       layout: 'fit', 
       items: this.list, 
      }); 

      this.items = this.listpanel; 

      myapp.views.ParentView.superclass.initComponent.apply(this, arguments); 
     }, 

    }); 

    Ext.reg('ParentView', myapp.views.ParentView); 

bir veri deposu ile

 

    Ext.regModel("ParentModel", { 
     hasMany: { 
      model: 'ChildrenModel', 
      name: 'children.child' // not too sure about this bit 
     }, 
     fields: [ 
      {name: 'parentId', type: 'string'} 
     ], 

     proxy: { 
      type: 'ajax', 
      url : 'models.json', 
      reader: { 
       type: 'json', 
       root: 'parents.parent' // this works fine 
      } 
     } 
    }); 

    Ext.regModel('ChildrenModel', { 
     belongsTo: 'ParentModel', // not too sure about this bit 
     fields: [{name: 'childId', type: 'string'}] 
    }); 

Şu anda uğraştığım şey, “çocuk” ve “ebeveyn” öğelerinin, sırasıyla “çocuklar” ve “ebeveynler” gibi başka bir unsur tarafından çevrelenmiş olmasıdır.

Herhangi bir yardım çok takdir edilmektedir. peşin

sayesinde

Philip

PS I dış "çocuk" sarma elemanını kaldırmak ve sadece iç "çocuk" elemanını (ve değişim "children.child" ile "çocuk" içinde bırakırsanız model tanımı) kod iyi çalışıyor. Benim kendi soru yanıtlama

PPS:

Doh! "Çocuk" öğesini ParentModel'in alanlarına eklemeyi unuttum.

aşağıdaki gibi olmalıdır (Not: Ben 'hasMany' ya belirtmek gerek yoktu 'dernek elemanları - Bu ya bunları içeren yararı nedir niçin çok emin değil):

 

    Ext.regModel("ParentModel", { 
     fields: [ 
      {name: 'parentId', type: 'string'}, 
      {name: 'children'} // VERY IMPORTANT TO ADD THIS FIELD 
     ], 

     proxy: { 
      type: 'ajax', 
      url : 'models.json', 
      reader: { 
       type: 'json', 
       root: 'parents.parent' // this works fine 
      } 
     } 
    }); 

    Ext.regModel('ChildrenModel', { 
     fields: [{name: 'childId', type: 'string'}] 
    }); 

şablon ince çok çalışır: benzer bir problem haline

 

    '<tpl for="children.child">', // this syntax works too. 
      {childId} 
    '</tpl>', 

cevap

7

:

bu JSON tüketir iade.

Ext.regModel("ParentModel", { 
     fields: [ 
      {name: 'parentId', type: 'string'}, 
      {name: 'children', convert: 
      function(value, record) { 
       if (value.child) { 
        if (value.child instanceof Array) { 
         return value.child; 
        } else { 
         return [value.child]; // Convert to an Array 
        } 
       } 

       return value.child; 
      } 
     } 
     ], 

     proxy: { 
      type: 'ajax', 
      url : 'models.json', 
      reader: { 
       type: 'json', 
       root: 'parents.parent' // this works fine 
      } 
     } 
    }); 

Not: Ben aslında yapmak ChildrenModel tanımlamanız gerekir. Sanırım Sencha'nın otomatik olarak dönüştürülmesi gerektiğinden, tanımlanmadan uzaklaşabilirim.

11

Ran düşünmek recently..I.

Modelinizde kullanmak istediğiniz verilerin eşlemesini belirtmeniz gerekir. Örneğin:

Ext.regModel('Album', { 
fields: [ 
    {name: 'artist_name', mapping: 'album.artist.name'}, 
    {name: 'artist_token', mapping: 'album.artist.token'}, 
    {name: 'album_name', mapping: 'album.name'}, 
    {name: 'token', mapping: 'album.token'}, 
    {name: 'small_cover_url', mapping: 'album.covers.s'}, 
    {name: 'large_cover_url', mapping: 'album.covers.l'} 
]/*, 
getGroupString : function(record) { 
    return record.get('artist.name')[0]; 
},*/ 

});

{ 
    "album":{ 
    "covers":{ 
     "l":"http://media.audiobox.fm/images/albums/V3eQTPoJ/l.jpg?1318110127", 
     "m":"http://media.audiobox.fm/images/albums/V3eQTPoJ/m.jpg?1318110127", 
     "s":"http://media.audiobox.fm/images/albums/V3eQTPoJ/s.jpg?1318110127" 
    }, 
    "artist":{ 
     "name":"New Order", 
     "token":"OyOZqwkN" 
    }, 
    "name":"(The Best Of)", 
    "token":"V3eQTPoJ" 
    } 

}, tek bir nesne veya bir dizi ise sürekli bakılmaksızın veri modelindeki şablon erişimine izin vermek için bir dönüştürücü ekledik


+0

Cool - haritalama işleri, bazen tek bir nesne döndüğü ve bazen bir dizi döndüğü için hala bir sorunum vardı. Ben şu an için gittiğim çözüm ile aşağıdan bir cevap daha ekledim. –