2014-10-21 2 views
0

Можно ли использовать ассоциации при загрузке вложенного GeoJson в FeatureStore через vectorLayer?Загрузка вложенного GeoJson в FeatureStore с hasMany. Возможное?

Ext.define('Employee', { 
     extend: 'Ext.data.Model', 
     proxy: { 
      type: 'memory', 
      reader: { 
       type: 'json', 
       idProperty: 'id' 
      } 
     }, 
     fields: [ { name: 'name', type: 'string' } ] 
    }); 

    Ext.define('Company', { 
     extend: 'Ext.data.Model', 
     proxy: { 
      type: 'memory', 
      reader: { 
       type: 'json', 
       idProperty: 'id' 
      } 
     }, 
     fields: [ { name: 'name', type: 'string' } ], 
     hasMany: { model: 'Employee', name: 'employees' } 
    }); 

    var jsonData = { 
     companies: [ 
      { 
       name: 'Foo', 
       employees: [ 
        { name: 'Jack' }, 
        { name: 'Joe' } 
       ] 
      }, 
      { 
       name: 'Bar', 
       employees: [ 
        { name: 'Jim' } 
       ] 
      } 
     ] 
    }; 

    Ext.define('CompaniesExt', { 
     extend: 'Ext.data.Store', 
     model: 'Company', 
     data: jsonData, 
     storeId: 'CompaniesExt', 
     proxy: { 
      type: 'memory', 
      reader: { 
       type: 'json', 
       root: 'companies' 
      } 
     } 
    }); 

    Ext.define('CompaniesGeoExt', { 
     extend: 'GeoExt.data.FeatureStore', 
     model: 'Company', 
     storeId: 'CompaniesGeoExt' 
    }); 

    // data from json 
    var jsonStore = Ext.create('CompaniesExt'); 

    // data from geoJson 
    var map = new OpenLayers.Map({ allOverlays: true }); 
    var geoJsonStore = Ext.create('CompaniesGeoExt'); 
    var layer = new OpenLayers.Layer.Vector('Companies', { 
     storeName: 'CompaniesGeoExt', 
     strategies: [ 
      new OpenLayers.Strategy.Fixed(), 
     ],   
     protocol: new OpenLayers.Protocol.HTTP({ 
      url: "/companies.geojson", 
      format: new OpenLayers.Format.GeoJSON(), 
     }) 
    }); 
    map.addLayers([layer]); 
    geoJsonStore.bind(layer); 

Итак, первый jsonStore работает, как и ожидалось, employeesStore получает заполняется для каждой компании. Второй geoJsonStore этого не делает. Данные сотрудников остаются в raw.data, а суб-магазины не заполняются при загрузке.

Должен ли он работать таким образом, или я что-то упускаю?

Вот содержание companies.geojson:

{ 
     "type": "FeatureCollection", 
     "features": [ 
      { 
       "geometry": { 
        "type": "point", 
        "coordinates": [ 0, 0 ] 
       }, 
       "type": "feature", 
       "properties": { 
        "name": "Foo", 
        "employees": [ 
         { "name": "Jack" }, 
         { "name": "Joe" } 
        ] 
       } 
      }, 
      { 
       "geometry": { 
        "type": "point", 
        "coordinates": [ 1, 1 ] 
       }, 
       "type": "feature", 
       "properties": { 
        "name": "Bar", 
        "employees": [ 
         { "name": "Jim" } 
        ] 
       } 
      } 
     ] 
    } 

ответ

0

Кажется, что самый простой способ для перезаписи данных после загрузки функций, например, на «featuresadded» событие:

rewriteEmployees: function(event){ 

     // which store 
     var store = event.features[0].layer.store; 

     // for each item do the rewrite 
     store.each(
     function(r){ 
      if (r.raw.data.emplyees) 
       r.raw.data.employees.forEach(function(e){ 
        r.employees().add(e); 
       }); 
       r.employees().commitChanges(); 
     } 
    ); 
},