“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”属性的不同值的主要内容,如果未能解决你的问题,请参考以下文章