У меня есть скрипка, которая демонстрирует это странное поведение. В двух словах, у меня есть пользовательское поле, которое расширяет 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()
, но все же это поле не отправляется. Что не так с этим и как я могу это исправить?
В вашем коде используется basicForm.getFieldValues()
, который вызывает basicForm.getValues()
с некоторыми параметрами, а форма при отправке использует тот же метод с разными параметрами. Одним из таких параметров является useDataValues
, который решает, использовать ли getModelData
или getSubmitData
.
Вы возвращаете пустой объект в свой метод getSubmitData
, который предотвращает его правильное получение значений.
Все, что вам нужно изменить, для обоих методов работы в текущем состоянии:
getSubmitData: function() {
return this.getModelData();
}
Ext.form.Basic.submit()
останова вExt.form.Basic.submit()
и видел, куда он меня ведет. Также, некоторые побочные советы, вы можете избежать вызова части.getForm()
, потому чтоformpanel
также имеет метод Mehtod submit, и все, что он делает, это вызываетbasicForm
submitbasicForm
.