Актуализиране на стойност на Ext.form.Panel

Следното трябва да е тривиално, но не мога да го накарам да работи: Имам следния Ext.form.Panel:

Ext.define('EvaluateIt.view.SiteEvaluationForm', {
    extend: 'Ext.form.Panel',
    alias : 'widget.siteEvaluationForm',
    id: 'evaluationId',
    requires: [
        'Ext.form.Panel',
        'Ext.form.FieldSet',
        'Ext.field.Url',
        'Ext.field.Select',
        'Ext.field.Hidden'
],
    config: {

        // We give it a left and top property to make it floating by default
        left: 0,
        top: 0,

        // Make it modal so you can click the mask to hide the overlay
        modal: true,
        hideOnMaskTap: true,

        // Set the width and height of the panel
        //width: 400,
        //height: 330,
        width: Ext.os.deviceType == 'Phone' ?  screen.width : 300,
        height: Ext.os.deviceType == 'Phone' ?  screen.height : 500,
        scrollable: true,
        layout: {
            type: 'vbox'
        },
        defaults: {
            margin: '0 0 5 0',
            labelWidth: '40%',
            labelWrap: true
        },
        items: [
            {   
                xtype: 'textfield',
                name: 'address',
                label: 'Address',
                itemId: 'address' 
            },   
            {
                xtype: 'hiddenfield',
                itemId: 'imageUriId',
                name: 'imageUri'
            },
            {
                xtype: 'button',
                itemId: 'siteImage',
                text: 'Take Photo'
            },
            {
                xtype: 'button',
                itemId: 'save',
                text: 'Save'
            }   
        ]
    }

});

Което се отваря от onItemDisclosure в списъчен изглед и по този начин има запис, обвързан с него.

Когато се докосне бутонът „siteImage“, потребителят избира изображение от фотогалерията и URI се записва във временно хранилище за обработка. Тази част работи добре.

Какво трябва да направя: Когато се докосне „запазване“ в горния формуляр, трябва да взема uri от временното хранилище и да го запиша в същото хранилище, в което се записват всички стойности от горния формуляр.

За да направя това, имам следния метод:

onSaveSiteEvaluation: function(button) {
    console.log('Button Click for Save');
    //var form = button.up('panel');
    var form = Ext.getCmp('evaluationId');
    //get the record 
    var record = form.getRecord();
    //get the form values
    //var values = form.getValues();
    // return a clone for updating of values
    var values = Ext.clone(form.getValues());

    //if a new siteEvaluation
    if(!record){
        var newRecord = new EvaluateIt.model.SiteEvaluation(values);
        Ext.getStore('SiteEvaluations').add(newRecord);
    }
    //existing siteEvaluation
    else {

        // get image uri from temp store
        var images = Ext.create('EvaluateIt.store.ImageQueue');

        images.queryBy(function(record,id){
            images = Ext.getStore(images);

            if (images.getCount() > 0) {
                var uri  = record.get('src');
                //  image = Ext.getCmp('imageUri');

                //image = form.setValue(uri);

                //form.getCmp('imageId').setValue(uri);

                console.log('URI: ' +  uri);

                // THIS DOES NOT WORK!!
                form.setValues({
                    imageUri: uri 
                })  

        //record.set('imageUri',uri)
                console.log('imageUri: '+ record.get('imageUri'));

             }
         });

         // do stuff
         record.set(values);
    }
    form.hide();
    //save the data to the Web local Storage
    Ext.getStore('SiteEvaluations').sync();

},

Всичко в този метод работи ОСВЕН мястото, където записвам стойността на uri във формуляра

form.setValues({
    imageUri: uri 
})

Опитах се да направя 'uriImage' като xType на hiddenfield и textfield, опитах се да клонирам стойностите от формуляра и т.н. и всичко това без абсолютно никакъв успех при актуализирането на действителния атрибут imageUri в магазина (ЗАБЕЛЕЖКА: Всички други стойности на формуляра се актуализират добре). какво ми липсва Благодаря!

АКТУАЛИЗАЦИЯ

Това работи:

images.queryBy(function(iRecord,id){
    images = Ext.getStore(images);

    if (images.getCount() > 0) {
        var uri  = iRecord.get('src');

        // update store with URI

        form.setValues({
            imageUri: uri 
        })

        values = form.getValues();

        record = form.getRecord();

            }
    });

    // do stuff
    record.set(values);

Всичко е наред, щом свършва добре!


person horcle_buzz    schedule 06.06.2013    source източник


Отговори (1)


Тъй като Ext.form.Panel няма метод setValue. Първо трябва да получите основна форма от него:

form.getForm().setValue();

АКТУАЛИЗАЦИЯ: Грешка, гледах документите на ExtJs, а не на Sencha Touch. вашият формуляр има метод setValue.

След като се обадите на setValues(), можете ли да отидете отново на getRecord()? Също така изглежда, че вашата вътрешна променлива record е дефинирана два пъти. Това не би трябвало да е проблем, но...

person sha    schedule 06.06.2013
comment
Всъщност сензорният панел с формуляри на sencha има това метод - person Amit Aviv; 06.06.2013
comment
Sha, първият пример за зареждане на данни в документацията docs.sencha.com/touch/2.2.1/#!/api/Ext.form.Panel използва метода setValue, така че не съм сигурен какво имате предвид? - person horcle_buzz; 06.06.2013
comment
Sha, опитах form.getRecord() след setValue(), но не работи. Трябва ли да изпратя промяната, преди действително да изпратя формуляра? Знам, че например в Grails бих направил дистанционно изпращане чрез повикване на Ajax. За ExtJS обаче нямам представа как да приложа това. - person horcle_buzz; 07.06.2013
comment
Мисля, че на този етап ще трябва да създадете цигулка, за да можем да ви помогнем допълнително. - person sha; 07.06.2013
comment
Съгласен съм... Ще събера един в следващите ден-два. Данке Шьон! - person horcle_buzz; 07.06.2013
comment
аз лошо! Възникваха няколко проблема: двойното деклариране на „досие“ беше един от основните. Извършването на getValue() и getRecord след извикването на setValues ​​тогава проработи. Актуализацията и отговорът са по-горе. - person horcle_buzz; 08.06.2013