2015-01-22 5 views
0

У меня есть простая модель, скажем:Extjs простая модель и магазин

Ext.define('UserModel', { 
    extend: 'Ext.data.Model', 

    fields: [ 
     {name: 'firstname', type: 'string'}, 
     {name: 'lastname',  type: 'string'} 
    ] 
}); 

И в JSon файл, который выглядит следующим образом:

{ 
"DatabaseInJSON": { 
    "Users": [ 
     { 
     "KeyFirstName": "John", 
     "KeyLastName": "Doe" 
     },{ 
     "KeyFirstName": "James", 
     "KeyLastName": "Howlett" 
     } 
    ], 
    "OtherStuffWeDontCareAbout": [ 
     ... 
    ] 
    } 
} 

Мой вопрос: Если я создаю магазин как это, как я могу сопоставить атрибут «firstname» от моей модели до «KeyFirstName» от моего json?

Ext.define('my.custom.Store', { 
    extend: 'Ext.data.Store', 

    model: 'UserModel', 

    proxy: { 
     type: 'ajax', 
     url: 'path/to/my/file.json', 
     reader: { 
      type: 'json', 
      rootProperty: 'DatabaseInJSON' 
     } 
    } 
}); 
+0

версии ExtJS ты используешь? –

ответ

2

Вам необходимо либо использовать mapping или convert функция

Посмотрите на демо-here, который демонстрирует как в действии.

Ради демонстрации я повернул свой магазин в memory прокси-магазин и вы, я полагаю, также доступ к вашему rootProperty неправильно, как это должно быть rootProperty: 'DatabaseInJSON.Users'

Код:

Ext.application({ 
    name: 'Fiddle', 

    launch: function() { 

     myData = { 
      "DatabaseInJSON": { 
       "Users": [{ 
        "KeyFirstName": "John", 
        "KeyLastName": "Doe" 
       }, { 
        "KeyFirstName": "James", 
        "KeyLastName": "Howlett" 
       }], 
       "OtherStuffWeDontCareAbout": {} 
      } 
     }; 


     Ext.define('UserModel', { 
      extend: 'Ext.data.Model', 

      fields: [{ 
       name: 'firstname', 
       mapping: 'KeyFirstName', 
       type: 'string' 
      }, { 
       name: 'lastname', 
       convert: function(v, record) { 
        return record.data.KeyLastName; 
       }, 
       type: 'string' 
      }] 
     }); 

     Ext.define('my.custom.Store', { 
      extend: 'Ext.data.Store', 

      model: 'UserModel', 

      proxy: { 
       type: 'memory', 
       reader: { 
        type: 'json', 
        rootProperty: 'DatabaseInJSON.Users' 
       } 
      } 
     }); 

     myStore = Ext.create('my.custom.Store', { 
      data: myData 
     }); 
     console.log(myStore.getRange()); 
    } 
}); 
1

Вообще ваши свойства JSon должны соответствовать одинаковые имена ваших полей, так что читатель может прочитать их должным образом, на карту «KeyFirstName» к «Firstname» Я думаю, что лучшим вариантом было бы создание в а mapping определение поля на модели.

Это применимо для всех запросов в глобальном масштабе, и я считаю, что это изменит отображение, когда оно придет к сохранению данных.

Чтобы использовать отображение в вашем случае, вам нужно будет что-то вроде:

Ext.define('UserModel', { 
    extend: 'Ext.data.Model', 

    fields: [ 
     {name: 'firstname', type: 'string', mapping: function(data) { return data.KeyFirstName; } }, 
     {name: 'lastname', type: 'string', mapping: function(data) { return data.KeyLastName; } } 
    ] 
}); 

Помимо изменения формата данных JSON, единственный другой способ, которым я могу думать о том, чтобы переопределить read или getResponseData метод JsonReader

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