0

以下は簡単なはずですが、動作させることができません: 次の 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」をhiddenfieldとtextfieldの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);

終わりよければ全てよし!

4

1 に答える 1

1

Ext.form.Panel には setValue メソッドがないためです。まず、基本的なフォームを取得する必要があります。

form.getForm().setValue();

更新:悪いことに、Sencha Touch ではなく、ExtJs のドキュメントを見ていました。フォームには setValue メソッドがあります。

に電話した後、もう一度setValues()行ってもらえますgetRecord()か? また、record内部変数が 2 回定義されているようです。それは問題ではないはずですが...

于 2013-06-06T15:50:25.720 に答える