Обновление значения в 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 скрытого поля и текстового поля, я пытался клонировать значения из формы и т. д., и все это безуспешно в обновлении фактического атрибута 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
На самом деле панель сенсорной формы сенчи имеет это метод - person Amit Aviv; 06.06.2013
comment
Ша, первый пример загрузки данных в документации docs.sencha.com/touch/2.2.1/#!/api/Ext.form.Panel использует метод setValue, поэтому я не уверен, что вы имеете в виду? - person horcle_buzz; 06.06.2013
comment
Ша, я попробовал 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