我写了一个扩展dijit.Tree的类,在每个节点旁边都包含一个单选按钮。我在表单中使用它来显示文件夹树,用户可以从中选择文件夹。这是代码:
define("my/Tree/RadioButton",
['dojo/_base/declare', 'dijit/Tree', 'dijit/form/RadioButton', 'dojo/dom-construct', 'dojo/_base/connect', 'dojo/on', 'dojo/_base/lang'],
function (declare, Tree, RadioButton, domConstruct, connect, on, lang){
var TreeNode = declare(Tree._TreeNode, {
_radiobutton: null,
postCreate: function(){
this._createRadioButton();
this.inherited(arguments);
},
_createRadioButton: function(){
this._radiobutton = new RadioButton({
name: this.tree.name,
value: this.tree.model.store.getIdentity(this.item) + '',
checked: false
});
domConstruct.place(this._radiobutton.domNode, this.iconNode, 'before');
if (this.tree.model.store.hasAttribute(this.item, 'checked')) {
var attrValue = this.tree.model.store.getValue(this.item, 'checked');
if (attrValue === true) {
this._radiobutton.set('checked', true);
}
}
connect.connect(this._radiobutton, 'onClick', this, function(){
// set any checked items as unchecked in the store
this.tree.model.store.fetch({
query: {checked: true},
onItem: lang.hitch(this.tree.model.store, function(item){
console.log('found checked item ' + this.getValue(item, 'name'));
this.setValue(item, 'checked', false);
})
});
// check the one that was clicked on
var radioValue = this._radiobutton.get('value');
this.tree.model.store.setValue(this.item, 'checked', true);
});
}
});
return declare(Tree, {
_createTreeNode: function(/*Object*/ args){
return new TreeNode(args);
}
});
});
问题在于,提交表单时,提交的值始终是所选第一个单选按钮的值,即使随后单击其他单选按钮也是如此。
我可以通过检查dom看到已检查单选按钮的value属性具有正确的值。但提交的内容始终是最初选择的值。
我有一个类似的类,它使用复选框小部件,而且一个工作正常。
根据一些反馈编辑我创建了一个更简单的版本,该版本不会使用商店中的属性跟踪已检查状态:
define("my/Tree/RadioButton",
['dojo/_base/declare', 'dijit/Tree', 'dijit/form/RadioButton', 'dojo/dom-construct'],
function (declare, Tree, RadioButton, domConstruct){
var TreeNode = declare(Tree._TreeNode, {
_radiobutton: null,
postCreate: function(){
this._createRadioButton();
this.inherited(arguments);
},
_createRadioButton: function(){
this._radiobutton = new RadioButton({
name: this.tree.name,
value: this.tree.model.store.getIdentity(this.item) + '',
checked: false
});
domConstruct.place(this._radiobutton.domNode, this.iconNode, 'before');
}
});
return declare(Tree, {
_createTreeNode: function(/*Object*/ args){
return new TreeNode(args);
}
});
});
但即使这仍然存在同样的问题 - 用户首先点击的任何单选按钮都是将要提交的值,而不管随后点击的其他按钮。
答案 0 :(得分:0)
我设法通过挂钩单选按钮的onchange事件解决了这个问题。钩子在未选中的单选按钮上显式设置为false,这似乎可以解决问题。我不确定为什么这是必需的。
答案 1 :(得分:0)
我有同样的问题。它曾经在较旧的Dojos中工作。具体来说,在"dijit.byId("whatever").checked"
函数期间,所有radioButtons在onClicked
上错误地返回true。在onClicked
函数使用FireBug控制台完成后手动检查时,上面的属性返回正确的值。我认为这是一个错误,我只是通过为每个按钮设置不同的onClicked
函数来解决它,如下所示:
<form id="locateForm">
<label for="locate">Locate:</label><br />
<input type="radio" dojoType="dijit.form.RadioButton" name="locate" id="locateAddress" value="Address" checked="checked" onClick="enableLocate1();" />
<label for="locateAddress">Address</label>
<input type="radio" dojoType="dijit.form.RadioButton" name="locate" id="locatePlace" value="Place" onClick="enableLocate2();" />
<label for="locatePlace">Place</label>
</form>