Actionscript3 - 禁用列表条目时从Comobox数据提供程序(XMLlist)中删除条目

时间:2016-03-30 19:30:46

标签: actionscript-3 flash combobox

我正在修改我没写过的代码,而且我对Actionscript的经验很少。

目前,菜单项在禁用时会显示为灰色。这是通过以下课程实现的:

  1. DisabledComboBox(扩展ComboBox)
  2. DisabledList(扩展名单)
  3. DisabledListItemRenderer(扩展标签)
  4. 菜单约束存储在大型XML变量MenuChoiceXML中。每个DisabledComboBox都指XMLlist,它是MenuChoiceXML的{​​{1}}的子集。 DataProvider中的每个列表条目都有一个elementsID(整数)。

    同样在XMLlists范围内的是MenuChoiceXML完整菜单约束,这些约束是根据数据库中可用的内容预先组装的。他们使用以下形式:

    • 选择15个约束5,12,23

    换句话说,在一个XMLlist中选择15,在其他DisabledComboBox中选择5,12和23,并且无法选择它们。

    我希望从DisabledComboBoxes DataProvider完全删除它们,而不是将它们变灰并禁用选择它们的MouseEvent。

    这些是我认为相关的代码:

    约束XMLlist

    中的项目
    XMLlist

    TotalStateofProgram.as

    <Constraints>
            <Cstr choice="DataProvider1" selectedValue="2" constrains="DataProvider2" denies="4,7,12" />
    </Constraints>
    

    上述代码重置所有约束,然后使用当前选定的菜单项将约束应用于其他菜单项。重要的是这一行:

    public function applyConstraints():void { // before updating menus all constrained menus enable all menu choices, then turn on restricted options for each(var menulist:String in constrainedMenuList) { for each(var xmlentry:XML in MenuChoicesXML.descendants(menulist).MenuItem) { xmlentry.@enabled=true; } } // Save constraints in XMLlist var cstrs:XMLList = MenuChoicesXML.descendants("Constraints").Cstr; // go through each contraint in list of constraints for each(var cstr:XML in cstrs) { var choice:String = cstr.@choice; var value:String = cstr.@selectedValue; // for each constraint - find if it is required constraint selectedValue matches current selection var applies:Boolean = (design.getData(choice) == value); if(applies) { var menuname:String = cstr.@constrains; var denies:String = cstr.@denies; var deniesarray:Array = denies.split(','); // Go throught items which are denied by selection for(var i:int = 0; i<deniesarray.length;i++) { var d:String = deniesarray[i]; // If something that is to be constrained is currently selected, unselect it from DisabledComboBox if(design.getData(menuname) == d) design.setData(menuname, "0"); // default elementsId for unselected is 0 // set disable menu choice for this elementsId (MenuChoicesXML.descendants(menuname).MenuItem.(@elementsId == d)).@enabled = "false"; } } } }

    它似乎正在查找(MenuChoicesXML.descendants(menuname).MenuItem.(@elementsId == d)).@enabled = "false";中的项目并禁用它。禁用后,XMLlistDisabledList会看到此项,其中所选项目变为灰色且已禁用与其关联的MouseEvent。 (我将发布后来实现此目的的代码,因为我并非100%相关)

    我意识到DisabledListItemRenderer通常会被使用,但我不确定如何使用ComboBox.removeItem()查找ComboBoxDataProvider(如上所述)。

    以下是我的一些问题:

    • 我可以查看elementsIDComboBox条目XMLlist的{​​{1}}并使用DataProvider吗?怎么样?

    • 我是否可以使用禁止ComboBox.removeItem()条目将其从列表中删除的事实?

    • 还有其他方式我不考虑吗?

    我将总结一下灰色XMLlist r列表条目的代码。我不确定它是否相关,因为对列表中的文本执行了灰化,这组成了DataProvide的{​​{1}},但是我想从DataProvider中删除该元素{1}}(这似乎不那么重要)。

    可能相关的代码:

    DisabledComboBox.as

    DisabledComboBox

    DisabledList.as

    DisabledCombobox

    DisabledListItemRenderer.as

    package com.cwmlib.controls
    {
        import mx.controls.ComboBox;
        import mx.core.ClassFactory;
        import mx.events.FlexEvent;
    
        public class DisabledComboBox extends ComboBox
        {
            public function DisabledComboBox()
            {
    
                super();
    
                this.dropdownFactory = new ClassFactory(DisabledList);
    
                this.itemRenderer = new ClassFactory(DisabledListItemRenderer);
    
            }
        }
    }
    

1 个答案:

答案 0 :(得分:0)

如果您在另一个组合框中选择某些内容,您想删除一个组合框中的某些项目吗?如果您选择其他东西,可能会再次显示它们?在这种情况下,filterFunction听起来是正确的工具。没有经过测试,但这会给你一个想法:

 $(function() {
    $( "#combobox" ).combobox();
    $( "#toggle" ).click(function() {
      $( "#combobox" ).toggle();
    });
  });

请记住,应用过滤器时,_myDataProvider将仅包含当前可见的项目。如果您需要再次完整收集,可以使用

重置数据提供者
$( "#combobox" ).combobox().autocomplete("widget").addClass('my-custom-autocomplete-class');

编辑:

这整个XML操作对我来说听起来很痛苦。摆脱自定义组合框和XML。解析你的XML并制作两个数据提供器 - 一个用于选择组合框,它将具有带有此拒绝属性的值对象:

// make a dedicated _myDataProvider for the filtered combobox and assign a filterfunction to it
_myDataProvider.filterFunction = filterCollection;

// Assign the dataProvider
filteredCombobox.dataProvider = _myDataProvider;

// filter the dataprovider when selection in the first combobox will change
selectionComboBox.addEventListener(Event.CHANGE, onComboBoxChange);


private function onComboBoxChange(e:Event):void
{
    // refresh the dataprovider, that will apply the filter
    _myDataProvider.refresh();
}

private function filterCollection(item:Object):Boolean
{
    // here you need to know the condition for the filter depending on the selection in the first combobox (prbably the selected item in the selection combobox?)
    // this filterCollection function will run trough each item in the _myDataProvider and return true (keep the item in the list) or false (the item will disappear)               
    if (condition)
        return true;
    else
        return false;
}

另一个用于过滤的组合框,其值对象将具有id,以检查是否应该过滤掉该项:

_myDataprovider.filterFunction = null;
_myDataprvider.refresh();

然后当选择组合框改变时,您过滤集合:

public class SelectionVO
{
    public var label:String;
    public var denies:Array; // for example, ["2", "3", "4"];
}