EXT Js Комплексная обработка ответов JSON: вставка сетки - PullRequest
3 голосов
/ 19 апреля 2011

Здравствуйте, я пытаюсь динамически вставить запись JSON в сетку.Мой ответ сервера выглядит следующим образом:

{
    "studentDetails":{
        "status":"ACTIVE",
        "subject":"MATH",
        "paymentOptions":"EFT",
        "idStudent":71,
        "firstName":"Alli",
        "lastName":"Alli",
        "middleName":"Alli",
        "grade":"A",
        "kumonLevel":"FK",
        "parentId":68,
        "userId":1,
        "parentBean":{
            "parentFirstName":"Alli",
            "idParent":68,
            "parentMiddleName":"Alli",
            "parentLastName":"Alli",
            "parentEmailId":"haigopi@gmail.com",
            "parentPhoneNumber":"3173797945"},
        "startTimeSlot":"12:00 AM",
        "endTimeSlot":"12:15 AM",
        "dob":"2012-07-04"},
    "success":true
}

Ученик, имеющий parentDetails в качестве отдельного объекта в ответе выше.

на моем клиенте, я сделал следующее: у меня была сетка с нижеконфигурация:

var studentRecord = Ext.data.Record.create( [ {
    name : 'firstName',
    type : 'string'
}, {
    name : 'lastName',
    type : 'string'
}, {
    name : 'middleName',
    type : 'string'
}, {
    name : 'grade',
    type : 'string'
}, {
    name : 'kumonLevel',
    type : 'string'
}, {
    name : 'startTimeSlot',
    type : 'string'
}, {
    name : 'endTimeSlot',
    type : 'string'
}, {
    name : 'subject',
    type : 'string'
}, {
    name : 'dob',
    type : 'date'
}, {
    name : 'status',
    type : 'string'
}, {
    name : 'paymentOptions',
    type : 'string'
}, {
    name : 'parentFirstName',
    mapping : 'parentBean.parentFirstName',
    type : 'string'
}, {
    name : 'parentLastName',
    mapping : "parentBean['parentLastName']",
    type : 'string'
}, {
    name : 'parentMiddleName',
    mapping : 'parentBean.parentMiddleName',
    type : 'string'
}, {
    name : 'parentPhoneNumber',
    mapping : 'parentBean.parentPhoneNumber',
    type : 'String'
}, {
    name : 'parentEmailId',
    mapping : 'parentBean.parentEmailId',
    type : 'string'
} ]);

var myProxy = new Ext.data.HttpProxy( {
    method : 'GET',
    url : 'listActiveStudents.do'
});
var studentsListReader = new Ext.data.JsonReader( {
    successProperty : 'success',
    root : 'studentDetails',
    idProperty : 'idStudent'
}, studentRecord);

var studentDS = new Ext.data.Store( {
    proxy : myProxy,
    autoLoad : true,
    totalProperty : 'total',
    reader : studentsListReader
});

при получении данных с сервера я сделал следующее:

handler : function() {
    studentForm.getForm().submit({
        url : 'createStudent.do',
        waitMsg : 'Saving Data...',
        submitEmptyText : false,
        success : function(form, action) {
            win.close();
            var studentDetail = action.result.studentDetails;
            var xyz = new studentDS.recordType(studentDetail, 0);
            studentDS.insert(0,xyz);
        }
    });
}

Проблема, с которой я сталкиваюсь здесь:

Когда записьвставил parentDetails не отображаются в сетке.Кажется, отображение не работает должным образом при вставке.Где, когда при загрузке сетки изначально она отрисовывается идеально.Я создал запись хорошо, которая показывает в debfoger Firefox также с допустимыми значениями.

Может ли кто-нибудь мне помочь, пожалуйста?

1 Ответ

4 голосов
/ 19 апреля 2011

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

var xyz = new studentDS.recordType(studentDetail, 0);

до этого:

var xyz = new studentDS.recordType(
    studentDS.reader.extractValues(
        studentDetail, 
        studentDS.fields.items,
        studentDS.fields.length
    ), studentDetail.idStudent); //use the idStudent of the studentDetail, so the id of the newly created record equals to your idStudent

И вот почему

Поэтому после отслеживания стека вызовов я обнаружил интересные различия между записями, которые вы загрузили из Store, и записью, которую вы создали с помощью new studentDS.recordType.

Обратите внимание на различия:

//This is the record created from Store Load event
    dob: Wed Jul 04 2012 00:00:00 GMT+0800 (Malay Peninsula Standard Time)
    endTimeSlot: "12:15 AM"
    firstName: "Alli"
    grade: "A"
    kumonLevel: "FK"
    lastName: "Alli"
    middleName: "Alli"
    parentEmailId: "haigopi@gmail.com"
    parentFirstName: "Alli"
    parentLastName: "Alli"
    parentMiddleName: "Alli"
    parentPhoneNumber: "3173797945"
    paymentOptions: "EFT"
    startTimeSlot: "12:00 AM"
    status: "ACTIVE"
    subject: "MATH"
    __proto__: Object

//This is the record created from your studentDS.recordType
    dob: "2012-07-04"
    endTimeSlot: "12:15 AM"
    firstName: "Alli"
    grade: "A"
    idStudent: 80
    kumonLevel: "FK"
    lastName: "Alli"
    middleName: "Alli"
    parentBean: Object
        idParent: 68
        parentEmailId: "haigopi@gmail.com"
        parentFirstName: "Alli"
        parentLastName: "Alli"
        parentMiddleName: "Alli"
        parentPhoneNumber: "3173797945"
        __proto__: Object
    parentId: 68
    paymentOptions: "EFT"
    startTimeSlot: "12:00 AM"
    status: "ACTIVE"
    subject: "MATH"
    userId: 1
    __proto__: Object

На самом деле, пока вы загружаете свои данные, ваши JsonStore и JsonReader сделали грязный хак с загруженными данными.Они линеаризуют ваши данные.Они перемещают все ваши данные из вашего parentBean в корень record.data, поэтому при рендеринге сетки ваша сетка может быть отображена правильно.

Чтобы узнать, как они отображают вашу сетку, проверьте код на Строка 827 файла GridView.js

meta.value = column.renderer.call(column.scope, record.data[column.name], meta, record, rowIndex, i, store);

Обратите внимание, как GridView собирает значения.Они используют record.data[column.name], чтобы получить значение каждого поля, и именно здесь весь ваш parent* отчет не определен.

И чтобы узнать, как они линеаризуют ваши коды, вы можете проверить строку 157 файла DataReader.js

var record = new Record(this.extractValues(n, fi, fl), this.getId(n));
//where:
//n = your raw json object
//fi = the field items
//fl = the field length

И на самом деле new Record они использовали здесьсовпадает с вашим new studentDS.recordType, за исключением того, что они extractValues для вас от имени, и, очевидно, вы не сделали этого, потому что это не очевидно.

Понятно?Надеюсь, что объяснение достаточно ясно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...