Заполнение формы EXTJS 4 с чтением JSON

Я новичок в EXTJS и пока использую EXTJS-4.1. У меня есть базовая форма, в которую мне нужно вводить данные о загрузке страницы. URL-адрес сервера вернет JSON.

[{"countryid":1,"countrycode":"US","countryname":"United States"}]

мой код формы

Ext.require([
    'Ext.form.*'
    //'Ext.layout.container.Column',
    //'Ext.tab.Panel'
    //'*'
]);

Ext.onReady(function() {
    Ext.QuickTips.init();

    var bd = Ext.getBody();

    /*
     * ================  Simple form  =======================
     */
    bd.createChild({tag: 'h2', html: 'Form 1 - Very Simple'});

    var required = '<span style="color:red;font-weight:bold" data-qtip="Required">*</span>';

Ext.define('app.formStore', {
extend: 'Ext.data.Model',
fields: [
   {name: 'countryid'},
   {name: 'countrycode'},
   {name: 'countryname'}
]
});

var myStore = Ext.create('Ext.data.Store', {
model: 'app.formStore',
proxy: {
    type: 'ajax',
    url : 'http://localhost/milestone_1/web/app_dev.php/md/country/show/1',
    reader:{ 
        type:'json'                     
    }
},
autoLoad:true,
    listeners: {
        load: function() {
            var form = Ext.getCmp('formJobSummary'); 
            form.loadRecord(myStore.data.first());
        }
    }
});


var testForm = Ext.create('Ext.form.Panel', {
                    width: 500,
                    renderTo: Ext.getBody(),
                    title: 'Country Form',
                    waitMsgTarget: true,
                    fieldDefaults: {
                        labelAlign: 'right',
                        labelWidth: 85,
                        msgTarget: 'side'
                    },
                    items: [{
                        xtype: 'fieldset',
                        items: [{
                                xtype:'textfield',
                                fieldLabel: 'ID',
                                name: 'countryid'
                            }, {
                                xtype:'textfield',
                                fieldLabel: 'CODE',
                                name: 'countrycode'
                            }, {
                                xtype:'textfield',
                                fieldLabel: 'COUNTRY',
                                name: 'countryname'
                        }]
                    }]

            });


    this.testForm.getForm().loadRecord(app.formStore);
});

Я смог заполнить тот же JSON в сетке. Не могли бы вы помочь мне с этим... Я получил много примеров в сети и пытался, но все равно не повезло. Приведенное выше также является измененным фрагментом кода, который я получил во время просмотра.


person leninmon    schedule 18.05.2012    source источник


Ответы (3)


load() функция асинхронная. Так что вы правильно сделали - создали обработчик события load и вложили туда логику. Однако вы сделали пару ошибок:

  1. В обработчике загрузки у вас будут некоторые параметры функции. Первый параметр будет храниться, поэтому вам не нужно использовать глобальную переменную.

  2. Вам не нужно иметь this.testForm.getForm().loadRecord(app.formStore); - потому что это недопустимая команда, и в этот момент вы не знаете, загружен ли ваш магазин на самом деле или нет. Убери это. У вас уже есть loadRecords в обработчике хранилища.

  3. Отрисовка формы и автоматическая загрузка магазина — это два разных события, и вы не можете контролировать их время. Поэтому я бы рекомендовал отключить autoLoad для магазина и вручную вызвать store.load() после того, как вы узнаете, что форма готова.

person sha    schedule 19.05.2012

var form = Ext.getCmp('formJobSummary');console.log(form), вероятно, вернет undefined. Присвойте имя форме и все готово. Или еще лучше...

// Ext.require([
// 'Ext.form.*'
//'Ext.layout.container.Column',
//'Ext.tab.Panel'
//'*'
// ]); // you dont need ext.require for ext integrated stuff

Ext.onReady(function () {
    Ext.QuickTips.init();

    //var bd = Ext.getBody(); 

    /*
     * ================  Simple form  =======================
     */
    //bd.createChild({
    //  tag: 'h2',
    //  html: 'Form 1 - Very Simple'
    //}); // over written by the form anyway

    // var required = '<span style="color:red;font-weight:bold" data-qtip="Required">*</span>'; // never used

    Ext.define('app.formStore', {
        extend: 'Ext.data.Model',
        fields: [{
            name: 'countryid'
        }, {
            name: 'countrycode'
        }, {
            name: 'countryname'
        }]
    });



    var testForm = Ext.create('Ext.form.Panel', {
        width: 500,
        renderTo: Ext.getBody(),
        name:'formJobSummary', //why your orignal bit wasn't working
        title: 'Country Form',
        waitMsgTarget: true,
        fieldDefaults: {
            labelAlign: 'right',
            labelWidth: 85,
            msgTarget: 'side'
        },
        items: [{
            xtype: 'fieldset',
            items: [{
                xtype: 'textfield',
                fieldLabel: 'ID',
                name: 'countryid'
            }, {
                xtype: 'textfield',
                fieldLabel: 'CODE',
                name: 'countrycode'
            }, {
                xtype: 'textfield',
                fieldLabel: 'COUNTRY',
                name: 'countryname'
            }]
        }]

    });

    var myStore = Ext.create('Ext.data.Store', {
        model: 'app.formStore',
        proxy: {
            type: 'ajax',
            url: 'http://localhost/milestone_1/web/app_dev.php/md/country/show/1',
            reader: {
                type: 'json'
            }
        },
        autoLoad: true,
        listeners: {
            load: function (store,record,e) {
                testForm.loadRecord(store.first());
            }
        }
    });


});
person Alex    schedule 21.05.2012
comment
загрузка: функция (хранение, запись, e) { form.loadRecord (store.first()); } должно быть: load: function (store,record,e) { textForm.loadRecord(store.first()); } - person slashwhatever; 13.02.2013
comment
Изменить — твой друг кашель - person Alex; 18.02.2013

несколько вещей, чтобы попробовать:

1) если вы ищете файл ur на локальном хосте, не помещайте localhost на URL-адрес, только напишите

URL: '/milestone_1/web/app_dev.php/md/country/show/1'

что делает ваш php-файл? не могли бы вы опубликовать код?

3) разместить конфигурацию прокси на модели, а не в магазине.

4) вы пытались проверить, читал ли магазин записи при загрузке? с console.log?

person Hataru    schedule 19.05.2012
comment
Просто из любопытства, почему вы рекомендуете отдельным записям иметь свои собственные настройки прокси? - person Alex; 21.05.2012
comment
что ты имеешь в виду .. я только спрашиваю, проверяет ли он, загружает ли магазин данные. Как ты это проверишь? я обычно прошу количество записей. Не думаешь? - person Hataru; 21.05.2012
comment
3) разместить конфигурацию прокси на модели, а не в магазине. Эх, я думаю, это была неправильная формулировка. Модель, а не запись. - person Alex; 22.05.2012