Невозможно отправить настраиваемое поле, которое расширяет представление данных

1

У меня есть скрипка, которая демонстрирует это странное поведение. В двух словах, у меня есть пользовательское поле, которое расширяет Ext.DataView. Мне нужно расширить dataview, потому что это поле должно иметь динамическое содержимое. Так определяется мое поле:

Ext.define('Ext.ux.SimpleList', {
    extend: 'Ext.DataView',
    alias: 'widget.simplelist', 
    requires: [
        'Ext.XTemplate'
    ],
    itemSelector: 'div.record',
    isFormField: true,
    getFieldIdentifier: function () {
        return this.name;
    },
    getModelData: function() {
        var me = this;
        var data = {};
        data[me.getFieldIdentifier()] = me.getValue();
        return data;
    },
    getSubmitData: function() { return {}; },
    submitValue: true,
    isValid: function () { return true; },
    isDirty: function () { return true; },
    validate: function () { return true; },
    isFileUpload: function() { return false; }, 
    constructor: function(config) {
        Ext.applyIf(config, {
            tpl: [
               '{% var name = this.owner.name; %}',
                '<tpl for=".">',
                    '<div class="record"><input record-id="{id}" type="checkbox" name="{[name]}" /> {label}</div>',
                '</tpl>',
                {compiled: true}
            ]
        });
        this.callParent([config]);
    },
    getValue: function () {        
        var cb = this.el.select("input").elements, i, res = [];
        for (i in cb) {
            if (cb.hasOwnProperty(i) && cb[i].checked) {
                res.push(cb[i].getAttribute("record-id"));
            }
        }
        return res;
    },
    setValue: function (values) {
        //not yet implemented
    }
});

И вот как я добавляю это поле в форму:

Ext.create("Ext.form.Panel",{
    renderTo: Ext.getBody(),
    items:[{
        xtype: "textfield",
        name: "text"
    },{
       xtype: "simplelist",
       name: "list",
       store: {
            fields: ["id", "label", "checked"],
            data: [{"id": "1", "label": "One"},{"id": "2", "label": "Two"}]
        }
    },{
       xtype: "button",
       text: "Submit",
       handler: function () {
            var frm = this.up("form").getForm();
            console.log(frm.getFieldValues()); // it' ok
            //simplelist field is not submitted
            this.up("form").getForm().submit({
                url: "/"
            });
        }
   }]
});

Как вы можете видеть, когда я отправляю форму, я регистрируюсь в значениях полей формы консоли. И что интересно, это то, что я вижу свое настраиваемое поле среди этих значений полей. Итак, у меня есть поле с isFormField установленное в true, это поле находится в списке, возвращаемом методом getFields() и это поле также относится к тем значениям, возвращаемым методом getFieldValues(), но все же это поле не отправляется. Что не так с этим и как я могу это исправить?

Теги:
extjs

1 ответ

2
Лучший ответ

В вашем коде используется basicForm.getFieldValues(), который вызывает basicForm.getValues() с некоторыми параметрами, а форма при отправке использует тот же метод с разными параметрами. Одним из таких параметров является useDataValues, который решает, использовать ли getModelData или getSubmitData.

Вы возвращаете пустой объект в свой метод getSubmitData, который предотвращает его правильное получение значений.

Все, что вам нужно изменить, для обоих методов работы в текущем состоянии:

getSubmitData: function() {
    return this.getModelData();
}
  • 0
    Спасибо, сэр! Оно работает!
  • 1
    В духе «научите человека ловить рыбу», не бойтесь копаться в (любом) фреймворковом коде, чтобы узнать, как он работает и что вы можете сделать, чтобы он работал на вас. Все, что я делал, это Ext.form.Basic.submit() останова в Ext.form.Basic.submit() и видел, куда он меня ведет. Также, некоторые побочные советы, вы можете избежать вызова части .getForm() , потому что formpanel также имеет метод Mehtod submit, и все, что он делает, это вызывает basicForm submit basicForm .
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню