【问题标题】:Problem setting text property of a combobox on application start in Flex在 Flex 中应用程序启动时设置组合框的文本属性的问题
【发布时间】:2011-07-20 13:35:43
【问题描述】:

我正在使用来自以下站点的组合检查示例: http://www.carballares.es/en/arcadio/?p=220

这是一个非常有用的组件,效果很好。

现在,我需要在应用程序启动时使用某些值(根据某些标准动态定义)设置此组合框的文本属性。问题是,虽然我在应用程序运行的其他时间设置组合框的文本属性没有问题,但不幸的是在启动时设置该属性似乎没有效果。

例如,我想将组合框的 text 属性设置为“Bob”(这是组合框的 dataprovider 中的项目之一),并在组合框上调用“set text”方法。执行分步显示“设置文本”方法正在接收正确的值项,但未设置 _text 属性。

我尝试在“ApplicationComplete”之前不做任何事情,但也没有任何乐趣。

提前感谢您提供的任何帮助或线索。

//编辑 这是代码(上面 URL 中的代码和其他一些更改的组合)。然而,正如我上面所说,这些代码确实有效。问题是它在应用程序启动时不起作用。每当触发事件并调用 setComboText 作为结果时,组合框的文本设置正确。

    private function onComboChecked(event:ComboCheckEvent):void {
        var obj:Object=event.obj;
        var index:int=selectedItems.getItemIndex(obj);
        if (index==-1) {
            selectedItems.addItem(obj);
        } else {
            selectedItems.removeItemAt(index);
        }

        setComboText();

        dispatchEvent(new Event("valueCommit"));
        dispatchEvent(new Event("addItem"));
    }

    public function setComboText():void {

        if (selectedItems.length>1) {
            // text='multiple'
            //modified by samuel

           var items:ArrayCollection = selectedItems;
           var selItems:String = "";

           for (var item:String in items) 
           {  
                if (items[item].label != "ALL" ) {
                 selItems = selItems + items[item].label + ",";
                }
           } 

           if (selItems.length > 0){
                selItems = selItems.substr(0,selItems.length - 1);
           }


           text = selItems;
        }
        if (selectedItems.length==1) {
            text=selectedItems.getItemAt(0)[labelField];
        }
        if (selectedItems.length<1) {
            //modified by samuel
            text="ALL";
            //Alert.show("text is "+text);
        }
    }

【问题讨论】:

    标签: apache-flex combobox


    【解决方案1】:

    尝试将此方法添加到您要扩展的主 ComboBox 组件中:

            public function set selectedValueList( val : String ) : void {
                var selectedValueArray :Array = val.toLowerCase().split(',');
                var dp :ArrayCollection = this.dataProvider as ArrayCollection;
                var newSelectedItems:ArrayCollection=new ArrayCollection();
                for each ( var selectedVal :String in selectedValueArray ){
                    for( var i :uint=0;i<dp.length;i++){
                        if( String(dp.getItemAt(i)[this.labelField]).toLowerCase() == selectedVal ){
                            newSelectedItems.addItem( dp.getItemAt(i) );
                        }
                    }
                }
                selectedItems = newSelectedItems;
                if (selectedItems.length>1) { text='multiple'; }
                if (selectedItems.length==1) { text=selectedItems.getItemAt(0)[labelField]; }
                if (selectedItems.length<1) { text=''; }            
                dispatchEvent(new Event("valueCommit"));
                dispatchEvent(new Event("addItem"));
            }
    

    那么当你想设置选中项的时候就这样调用:

    myComboId.selectedValueList = 'Selected Label 1,Selected Label 2';
    

    或者在组件mxml def中设置:

    <local:ComboBox selectedValueList="Selected Label 1,Selected Label 2" ...rest of properties.../>
    

    或者绑定到它:

    <local:ComboBox selectedValueList="{variableHoldingCommaDelimList}" ...rest of properties.../>
    

    让我知道进展如何。 :)

    【讨论】:

    • 感谢内特的努力。实际上,那里已经有一些与您自己的代码非常相似的代码。无论如何我都尝试了你的(尽管我不得不对其进行一些更改(将“set selectedValueList”更改为“setSelectedValueList”并将分配方法更改为传递值而不是分配))。不幸的是,仍然没有快乐。逻辑是正确的,因为它适用于其他情况。只是它在启动时不起作用。再次感谢您的努力。它仍然受到赞赏。
    • 嗯,里面的那个需要你传递实际的对象,而这只是一个字符串。启动是指应用程序首次加载时,还是该组件像列表/项目渲染器一样动态添加到屏幕?我认为这是创建列表和设置值之间的时间问题。
    • 您可以在我上面编辑的帖子中看到代码。和你放的一样。我的意思是当应用程序首次加载时。调用 set 方法时不会更改 text 属性。实际上,在一次调试会话中,我发现它按预期工作,但这完全是侥幸,这让我更加认为,就像你一样,这是一个时间问题。我目前正在尝试提出一个(不太理想的)解决方案作为解决方法。再次感谢您的意见。
    【解决方案2】:

    对于组合框,我不确定您所说的“设置文本”是什么意思。相反,它应该是您应该设置的 selectedIndex 。除此之外,代替 applicationComplete 或 creationComplete,覆盖 commitProperties 方法并在那里分配这个初始属性(尽管您可以简单地在 mxml 本身中分配 selectedIndex)。

    【讨论】:

    • “设置文本”是指 text 属性的设置方法。我不知道还能怎么说。我不能使用 selectedIndex 因为可能选择了多个项目(由于组件和数据的性质)。而且我不能重写 commitProperties 方法,只在那里设置值,因为正如我所说,它需要根据情况动态设置。不过感谢您的提示。这是一个很好的记忆。一旦设置了文本属性,我什至尝试调用 commitProperties,但没有任何乐趣。我相信这个问题与它更新的时间有关..
    • ... 仅在启动时。似乎仍在绘制项目的事实意味着它们没有被正确更新。可能是 Flex 错误?
    • 您是否尝试过使用 selectedIndex 或 selectedItem 属性?我提出这个的唯一原因是因为 Combobox 将有一个 selectedItem。您在渲染器中所做的选择和取消选择取决于您,但组件本身将有一个 selectedItem。
    • @the_new_mr 如果您能发布一些代码,那就太好了。正如我上面提到的,如果你在 commitProperties 中处理“addItems()”,它就可以解决问题。
    • @FlexFiend selectedIndex 不够,因为可能同时选择了多个项目
    猜你喜欢
    • 2012-05-15
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多