我正在尝试使用 ext_scaffold 为 Rails 支持的 Web 应用程序生成 UI 元素。
但是,我遇到了布尔字段行为的问题。例如,当我这样做时
./script/generate ext_scaffold product name:string description:text sku:integer available:boolean
它会正确构建迁移并生成带有布尔字段复选框的用户界面。
但是,选中此框只会修改正在创建的对象。如果记录已存在,则复选框的状态准确地反映了该字段。但是,编辑它失败了——即,选中或取消选中它并保存记录并不会改变它。
深入代码,我们发现:
items: [
{ fieldLabel: scaffoldPanel.labels['product[name]'], name: 'product[name]', xtype: 'textfield' },
// ... other fields ...
{ fieldLabel: scaffoldPanel.labels['product[available]'], name: 'product[available]', xtype: 'checkbox', inputValue: '1' }, { xtype: 'hidden', name: 'product[available]', value: '0' }
],
我觉得问题在于 Rails 或 Ext 对同名元素感到困惑。无论哪种方式,在创建记录后,单击复选框不会执行任何操作(选中或未选中,该字段保持为“0”。)
在玩了一会儿之后,事实证明,如果我们将隐藏字段放在复选框上方,则无论该字段现在在编辑后设置为 true 。也不完全是理想的行为。
有没有其他人遇到过这个问题?有什么解决方法吗?谢谢。
更新:
请注意,即使选中了该字段的复选框,发送的 POST 请求也表明该字段设置为 false。所有其他字段类型正在适当更新...
更新2:
好吧,找到了一篇很棒的博客文章,描述了 Semergence 对这个问题的解决方案,但我仍然无法让它发挥作用......我已将他的解决方案改编如下:
onOk: function() {
// ....
if (scaffoldPanel.getFormPanel().currentMode == 'edit') {
// set up request for Rails create action
submitOptions.params._method = 'PUT';
submitOptions.url = submitOptions.url + '/' + selected.data.id;
}
// ----- checkbox serializer ------
var serializedForm = scaffoldPanel.getFormPanel().getForm();
// because unchecked checkboxes do not submit values, manually force a value of 0
serializedForm.items.each(function(f) {
//alert("Checking \"" + f.getName() "\" field...");
if (f.isFormField && f.getXType() == 'checkbox' && !f.getValue()) {
alert("Auto setting \"" + f.getName() + "\" field to 0...");
serializedForm.getValues()[f.getName()] = '0';
}
});
// ------- end serializer -------
serializedForm.submit(submitOptions);
//scaffoldPanel.getFormPanel().getForm().submit(submitOptions);
},
现在警报被正确抛出,指示正确的字段并断言它将被设置为零。
除非这不会发生在实际发送的 post 请求中——事实上,如果未选中该复选框,则它在 POST 中根本没有值。
有人可以帮我理解这里发生了什么吗?