“event.target as Checkbox”通过 Mouse CLICK 事件传递“selected”属性的不同值
Posted
技术标签:
【中文标题】“event.target as Checkbox”通过 Mouse CLICK 事件传递“selected”属性的不同值【英文标题】:"event.target as Checkbox" is passing different value of "selected" property through Mouse CLICK event 【发布时间】:2015-07-15 04:11:14 【问题描述】:我有一个复选框,我正在以编程方式为其设置“选定”属性。设置完值后,鼠标点击处理程序开始动作,其余的逻辑都在里面。
事件处理程序能够通过以下方式获取选中的复选框:
event.target as CheckBox;
但它没有获取“selected”属性的正确值。例如如果我将属性设置为“FALSE”,那么在获取 CheckBox 后,发现它的值为“TRUE”。 这种行为很奇怪,我以前从未遇到过这样的问题。
在这方面的任何帮助将不胜感激!
以下是代码截图:
CheckBox.selected 设置为 FALSE:
filterUIObject.filterCheckBox.selected = false;
filterUIObject.filterCheckBox.dispatchEvent(new MouseEvent(MouseEvent.CLICK));
filterUIObject 是一个对象,它持有对多个控件和容器的引用,如下所示:
var filterUIObject:Object = new Object();
var cbSelected:Boolean = false;
var tiValue:String = "";
var dateFilterName:String = dateByVariableFilterNames.getItemAt(i) as String;
var dateByVarCB:CheckBox = new CheckBox();
dateByVarCB.addEventListener(MouseEvent.CLICK, checkBoxClickHandler);
dateByVarCB.id = dateFilterName+"_CB";
dateByVarCB.name = dateFilterName;
dateByVarCB.label = dateFilterName;
dateByVarCB.toolTip = RB.getString('Common.ToolTip.SelectOccurrences.txt');
//dateByVarCB.selected = cbSelected;
// Creates last <TextInput> occurrences
var lastOccurrencesTI:TextInput = new TextInput();
lastOccurrencesTI.id = dateFilterName+"_TI";
lastOccurrencesTI.name = dateFilterName+"_TI";
lastOccurrencesTI.toolTip = RB.getString('Common.ToolTip.Occurrences.txt');
lastOccurrencesTI.width = 30
lastOccurrencesTI.text = ""+tiValue;
lastOccurrencesTI.restrict = RESTRICT_TO_CHARS;
lastOccurrencesTI.maxChars = 2;
var occurrencesLabel:Label = new Label();
occurrencesLabel.text = RB.getString('GallerySecondaryFilterPage.Occurrences.label.txt');
var eachRowContainer:GridRow = new GridRow();
var gridItem:GridItem = new GridItem();
var filterContainerVB:VBox = new VBox();
filterContainerVB.id = dateFilterName;
filterContainerVB.name = dateFilterName;
filterContainerVB.percentWidth = 33;
filterContainerVB.height = 65;
var horizontalContainer:HBox;
horizontalContainer = new HBox();
horizontalContainer.percentWidth = 100
horizontalContainer.percentHeight = 100;
var spaceVarLabel:Label = new Label();
spaceVarLabel.text = "";
horizontalContainer.addChild(spaceVarLabel);
horizontalContainer.addChild(lastOccurrencesTI);
horizontalContainer.addChild(occurrencesLabel);
filterContainerVB.addChild(dateByVarCB);
filterContainerVB.addChild(horizontalContainer);
gridItem.addChild(filterContainerVB);
eachRowContainer.addChild(gridItem);
this.addChild(eachRowContainer);
// update data in filterUIObject.
filterUIObject.filterContainer = eachRowContainer;
filterUIObject.dateFilterName = dateFilterName;
filterUIObject.filterCheckBox = dateByVarCB;
filterUIObject.filterTextInput = lastOccurrencesTI;
filterUIObject.filterOccurrencesLabel = occurrencesLabel;
filterUIObjects[i] = filterUIObject;
这是事件处理程序:
private function checkBoxClickHandler(event:MouseEvent):void
var selectedCheckBox:CheckBox = event.target as CheckBox;
var checkBoxID:String = selectedCheckBox.id;
if(selectedCheckBox.selected)
for each(var filterUIObject:Object in filterUIObjects)
if(checkBoxID == filterUIObject.filterCheckBox.id)
filterUIObject.filterOccurrencesLabel.enabled = true;
filterUIObject.filterTextInput.enabled = true;
//filterUIObject.filterTextInput.text = DEFAULT_OCCURENCE_VALUE;
break;
else
for each(filterUIObject in filterUIObjects)
if(checkBoxID == filterUIObject.filterCheckBox.id)
filterUIObject.filterOccurrencesLabel.enabled = false;
filterUIObject.filterTextInput.enabled = false;
//filterUIObject.filterTextInput.text = "";
break;
每当我调试时,上述事件处理程序中的代码总是进入“IF”块,从不进入“ELSE”块(即使初始值设置为“FALSE”)。
是因为我将控件引用存储在对象中吗?如果是,可以做些什么来检索正确的值?
【问题讨论】:
不要调度 MouseEvent,使用自定义事件。通过使用实际上同时调度的内置事件,您会混淆自己和 Flash Player。无论您每次单击任何位置时,都会发送 MouseEvent,因此如果您在其上发送另一个 MouseEvent,如果遇到令人困惑的麻烦,请不要感到惊讶。在您停止调度 MouseEvent 之前,您的问题永远不会得到解决。 好的,我可以试试。但我有一个问题 - 我已将鼠标单击事件绑定到特定的复选框,但它仍然会产生歧义吗? 当然,该复选框确实会在内部调度 mouseevent,如果您让它调度更多的 mouseevent,它们也会在内部处理并造成混乱。 @BotMaster... 感谢您的建议,但不幸的是,我们应该避免在我们的项目中创建自定义事件。该架构不鼓励这种方法。我进一步意识到语句'filterUIObject.filterCheckBox.selected = false;'由于复选框引用存储在 object-filterUIObject 中,因此可能无法按预期工作。有没有其他解决方法? 【参考方案1】:您可以尝试使用 spark 复选框而不是 mx 复选框,如果您的组件是 spark,您的代码将可以工作。 要修复 mx(Halo 主题),您可以使用更改事件而不是鼠标单击事件尝试此代码
filterUIObject.filterCheckBox.selected = false;
filterUIObject.filterCheckBox.dispatchEvent(new Event(Event.CHANGE));
private function checkBoxClickHandler(event:Event):void
【讨论】:
感谢@Arulkumar,“Event.CHANGE”运行良好。我认为我的猜测是正确的,存储在 Object 中的复选框引用使得存储“selected”属性变得困难,因此它没有获取正确的值。再次感谢! :)以上是关于“event.target as Checkbox”通过 Mouse CLICK 事件传递“selected”属性的不同值的主要内容,如果未能解决你的问题,请参考以下文章