2012-02-10 89 views
4

我正在使用ExtJS 4.0.7,是Ext新增的,并且正在使用新的MVC体系结构。我有一个RadioGroup,在更改时我想用它来显示更多的UI元素。问题是,更改事件为RadioGroup激发两次。我假设这是因为两个无线电台都会触发一个事件,让它们的值发生变化。ExtJS 4 RadioGroup更改事件两次触发

有没有一种方法可以侦听RadioGroup或Radios的相同名称只会触发一次的更改?在我使用jQuery和Flex的经验中,我期望RadioGroup只能触发一次。

这里是在我看来,RadioGroup中代码:

items: [{ 
    xtype: 'radiogroup', 
    id: 'WheatChoice', 
    padding: '', 
    layout: { 
     padding: '-3 0 4 0', 
     type: 'hbox' 
    }, 
    fieldLabel: 'Choose Model', 
    labelPad: 5, 
    labelWidth: 80, 
    allowBlank: false, 
    columns: 1, 
    flex: 1, 
    anchor: '60%', 
    items: [ 
     { xtype: 'radiofield', id: 'SpringWheat', padding: '2 10 0 0', fieldLabel: '', 
      boxLabel: 'Spring', name: 'wheat-selection', inputValue: '0', flex: 1 }, 
     { xtype: 'radiofield', id: 'WinterWheat', padding: '2 0 0 0', fieldLabel: '', 
      boxLabel: 'Winter', name: 'wheat-selection', inputValue: '1', checked: true, flex: 1 } 
    ] 
}] 

下面是我的控制器相关代码:

init: function() { 
    this.control({ 
     '#WheatChoice': { 
      change: this.onWheatChange 
     } 
    }); 
}, 

onWheatChange: function(field, newVal, oldVal) { 
    //this fires twice 
    console.log('wheat change'); 
} 
+0

确认([小提琴](http://jsfiddle.net/molecule/4sTQQ/))。看起来像一个错误。 – 2012-02-10 14:57:20

+0

这不是一个解决方法。我只创建了bug的展示。 – 2012-02-10 15:30:03

+0

对不起,我正在谈论我发布的东西。这是一种解决方法:将选择器更改为'#WheatChoice radio',并使用事件侦听器中的逻辑忽略任何不等于true的新值。 – 2012-02-10 15:37:30

回答

5

http://www.sencha.com/forum/showthread.php?132176-radiogroup-change-event-fired-twice/page2

埃文特说,这将是固定的4.1,所以它绝对是一个错误。

但是,您可以处理这种情况很容易地:

//borrowing your function 
onWheatChange: function(rg, sel) { 
    var selection = sel['wheat-selection']; 

    if (!(selection instanceof Object)) { 
     alert(selection); 
    } 

} 

VAR的选择将成为新的价值。我知道它不能解决两个事件触发问题,但希望这有助于!

+0

我接受这一点,因为这是一个错误和解决方法。谢谢。 – 2012-02-13 15:57:45

0

,因为初始值被设定可能会被解雇,并触发事件。尝试添加第三个无线电元素并查看它是否触发三次。

+0

我用一个包含四个项目的不同无线电组做了它。它发射两次。一旦告诉我新选择的无线电数值发生了变化,并且一次告诉我旧无线电数值更改为checked = false。 – 2012-02-10 15:00:02

4

它触发两次的原因是因为您的收音机组发生了两个变化。

单选按钮正在从checked=true更改为checked=false,然后您新单击的单选按钮将从checked=false更改为checked=true。这应该是一个预期的事情。

如果您想在单选按钮不再检查时执行某些操作,该怎么办?你会错过整个活动。真的,你应该只是做一个检查你的听众功能,只听取具有checked=true的单选按钮。

+0

这是我也采用过的解决方案,但我不同意想要了解组中的单选按钮。理论上,RadioGroup应该提供一个价值和一个事件。 – 2012-02-13 15:58:34

0

试试这个:

change : function(thisFormField, newValue, oldValue, eOpts) { 
      if (!Ext.isArray(newValue.myTransitionsRadio)) { 
       // Code goes here. 
      } 

在我的情况在这里myTransitionsRadio,是给所有单选按钮的通用名称。

由于 Nagendra