2013-06-06 4 views
0

Я не смог разобрать мои вложенные данные json, и я попытался разными способами, но я не смог добиться успеха. любая помощь приветствуется. Вот мой выход JSON выглядит следующим образом:Sencha touch2: Как я могу разобрать мои вложенные данные json?

[ 
    { 
    "task": { 
     "locator": "FGWESD", 
     "subtask": [ 
     { 
      "work": { 
      "number": "1145", 
      "id": "0", 
      "status": true, 
      "gate": "N\/A", 
      }, 
      "sequenceNumber": "0", 
      "id": "0" 
     }, 
     { 
      "work": { 
      "number": "1145", 
      "id": "0", 
      "status": true, 
      "gate": "N\/A", 
      }, 
      "sequenceNumber": "0", 
      "id": "0" 
     } 
     ], 
     "connectTime": "0", 
     "id": "0" 
    } 
    } 
] 

Вот моя модель:

Ext.define('MyApp.model.MyModel',{ 
    extend:'Ext.data.Model', 
    xtype:'myModel', 
    config:{ 
     fields:[ 
     {name:'number',mapping:'work.number'}, 
     {name:'id',mapping:'work.id'}, 
     {name:'locator',mapping:'task.locator'}, 
     {name:'gate',mapping:'work.gate'} 

     ] 
    } 
}); 

Вот магазин:

Ext.define('MyApp.store.StoreList', { 
    extend:'Ext.data.Store', 
    config:{ 
     model:'MyApp.model.MyModel', 
     storeId: 'id_Store', 
// added the url dynamically inside the controller 
     proxy:{ 
      type:'ajax', 
      reader: 
      { 
       type:"json", 
       rootProperty: 'subtask' 
      }, 
      method: 'POST', 
      actionMethods: { 
       create : 'POST', 
       read : 'POST', // by default GET 
       update : 'POST', 
       destroy: 'POST' 
      }, 
      headers :{ 
       "Content-Type" :'application/xml', 
       'Accept':'application/json' 
      } 

     } 
    } 
}); 

Вот мой код контроллера:

Ext.define('MyApp.controller.LoginController', { 
     extend: 'Ext.app.Controller', 
     requires: ['Ext.data.proxy.Rest'], 

     config: { 
// My code is too long to add here so am adding store loading when user taps login button 

}, 
    getDetails: function(){ 
     var segmentStore = Ext.create('MyApp.store.StoreList'); 
     var url = 'http://localhost:8080/apps'; 
     segmentStore.getProxy().setUrl(url.trim()); 
     segmentStore.load({ 
        scope:this, 
        callback: function(records, operation, success){ 
         if(success){ 
          console.log('records: ',records); 

          console.log('records: '+records.length); // prints here 1 
          console.log('locator: '+records[0].getData().locator); 
// prints FGWESD 
          console.log('locator: '+records[0].getData().number); 
//prints undefined 
// 
         } 
} 
      } 
     ) 
    }, 
}); 

Может ли любой ne, пожалуйста, помогите мне. как я могу получить значения числа, ворот, идентификатора и статуса? Какие изменения необходимо внести в модель, хранилище и контроллер? Пожалуйста, помогите мне в разрешении? Благодарю.

+1

Я не думаю, что вы можете сделать это, просто используя 'rootProperty' и' mapping'. У вас есть несколько предметов «задачи» или только один? –

+0

просто одна задача. любая помощь ? – chipmunk

+0

Можете ли вы перестроить свой JSON? –

ответ

3

Как я уже писал в комментариях, я не думаю, что вы можете добиться того, что без ручного разбора данных и загрузки его в магазин. Таким образом, функция getDetails должна выглядеть следующим образом:

getDetails: function(){ 
    var segmentStore = Ext.create('MyApp.store.StoreList'); 
    Ext.Ajax.request({ 
     url: 'http://localhost:8080/apps', 
     success: function(response){ 
      var responseObj = Ext.decode(response.responseText); 
      var task = responseObj[0].task; 
      var locator = task.locator; 
      var subtasks = []; 
      Ext.each(task.subtask, function(subtask) { 
       subtasks.push({ 
        number: subtask.work.number, 
        id: subtask.work.id, 
        gate: subtask.work.gate, 
        locator: locator 
       }); 
      }); 
      segmentStore.setData(subtasks); 
     } 
    }); 
} 

Кроме того, при использовании этого метода вы должны удалить отображение из модели, и вы можете избавиться от определения прокси-магазина. Кроме того, я не уверен, почему вы хотите создать хранилище в «getDetails», а не определять его в конфигурации «магазинов» контроллера, но, возможно, у вас есть причины. Я не запускал код, так что, может быть, ошибки, но я надеюсь, что вы получите эту идею.

+0

Спасибо за ответ. Оно работает. – chipmunk

+0

Прохладный, вы согласитесь с ответом? –

+0

Я принял. Большое спасибо. – chipmunk

0

Я думаю, что корень свойство вашего магазина должно быть:

rootProperty: 'task.subtask' 
+1

Обратите внимание, что полный объем его данных - это массив, а не объект –

+0

. Я использовал вышеупомянутое, как вы и предполагали, но все равно получаю ту же ошибку: undefined. любая помощь ? – chipmunk

Смежные вопросы