Почему обратный вызов успеха не вызывается в представлении формы extjs?

Я пытаюсь загрузить файл с использованием форм Ext JS, а в случае успеха или неудачи показать соответствующие сообщения. Но я не могу получить желаемый результат. Я не могу сделать обратные вызовы success или failure в действии form.submit.

До сих пор я делал следующее:

Создание формы с помощью этого script:

new Ext.FormPanel({
    fileUpload: true,
    frame: true,
    url: '/profiler/certificate/update',
    success: function() {
        console.log(arguments);
    },
    failure: function() {
        console.log(arguments);
    }
}).getForm().submit()


​/*
    The response Content-Type is text/html (with charcode=utf8);
    The response JSON is: { "success": true }
*/​​

Настройка ответа Content-Type на text/html на основе этого ответа.
Отправка соответствующего результата JSON на основе Ext JS docs. Ответ, полученный через Fiddler:

{"success":false}

или

{"success":true}

Я даже установил ответ Content-Type на application/json. Но до сих пор нет успеха.

Я читал такие ссылки, как этот и этот, но ни один из им помогли. Обратите внимание, что я также попробовал еще один script, который создает форму с полем для загрузки и кнопкой сохранения, и я отправил форму в обработчик кнопки сохранения. Но все же обратный вызов не запускается.

Ответ 1

Вот рабочий пример - Javascript code:

Ext.onReady(function () {

    Ext.define('ImagePanel', {
        extend: 'Ext.form.Panel',
        fileUpload: true,
        title: 'Upload Panel',
        width: 300,
        height: 100,

        onUpload: function () {
            this.getForm().submit({
                url: 'upload.php',
                scope: this,
                success: function (formPanel, action) {
                    var data = Ext.decode(action.response.responseText);
                    alert("Success: " + data.msg);
                },
                failure: function (formPanel, action) {
                    var data = Ext.decode(action.response.responseText);
                    alert("Failure: " + data.msg);
                }
            });
        },

        initComponent: function () {
            var config = {
                items: [
                    {
                        xtype: 'fileuploadfield',
                        buttonText: 'Upload',
                        name: 'uploadedFile',
                        listeners: {
                            'change': {
                                scope: this,
                                fn: function (field, e) {
                                    this.onUpload();
                                }
                            }
                        }
                    }
                ]
            };

            Ext.apply(this, Ext.apply(this.initialConfig, config));
            this.callParent(arguments);
        }
    });


    var panel = Ext.create('ImagePanel', {
        renderTo: Ext.getBody()
    });
});

И PHP-код:

<?php
if (isset($_FILES)) {
    $temp_file_name = $_FILES['uploadedFile']['tmp_name'];
    $original_file_name = $_FILES['uploadedFile']['name'];

    echo '{"success": true, "msg": "'.$original_file_name.'"}';

} else {
    echo '{"success": false, "msg": "No Files"}';
}

Ответ 2

Я боролся с этим уже довольно давно. Здесь мой код:

Ext.getCmp('media-upload-form').getForm().doAction('submit', {
    url: './services/recordmedia/upload',
    method: 'post',
    waitMsg: 'Please wait...',
    params: {
        entityId: this.entityId,
    },
    failure: function(form, action){
        alert(_('Error uploading file'));
        this.fireEvent('file-upload');
        this.close();
    },
    success: function(form, action){
        this.fireEvent('file-upload');
        this.close();
    },
    scope: this
})

Ответ всегда был завернут в <pre> теги браузером, что заставило Extj lib не вызывать обратные вызовы. Чтобы исправить это:

  • убедитесь, что ваш сервер возвращает правильный json: { "success": true}
  • убедитесь, что для типа содержимого задано значение text/html

Ответ 3

Собственно, это хорошо освещено документами для Ext.form.Panel и Ext.form.Basic. Проблема с вашим кодом не работает в том, что нет параметров конфигурации "успех", "сбой" для панели формы. Вы должны поместить их в объект конфигурации, переданный в действие submit. Поэтому ваш код должен выглядеть так:

new Ext.FormPanel({
    fileUpload: true,
    frame: true


}).getForm().submit({
    url: '/profiler/certificate/update',
    success: function() {
        console.log(arguments);
    },
    failure: function() {
        console.log(arguments);
    }
});

Обратите внимание на разницу: в Ext 4 есть компонент формы (Ext.form.Panel), который в основном представляет собой компонент вида, связанный с тем, как вы формируете внешний вид, а затем существует базовый класс формы (например, Ext.form. Basic), связанных с функциональностью. Представления форм обрабатываются Ext.form.Basic(или что-то, возвращаемое вашим form.getForm()).