我正在修改我没写过的代码,而且我对Actionscript的经验很少。
目前,菜单项在禁用时会显示为灰色。这是通过以下课程实现的:
DisabledComboBox
(扩展ComboBox)DisabledList
(扩展名单)DisabledListItemRenderer
(扩展标签)菜单约束存储在大型XML变量MenuChoiceXML
中。每个DisabledComboBox
都指XMLlist
,它是MenuChoiceXML
的{{1}}的子集。 DataProvider
中的每个列表条目都有一个elementsID(整数)。
同样在XMLlists
范围内的是MenuChoiceXML
完整菜单约束,这些约束是根据数据库中可用的内容预先组装的。他们使用以下形式:
换句话说,在一个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";
中的项目并禁用它。禁用后,XMLlist
和DisabledList
会看到此项,其中所选项目变为灰色且已禁用与其关联的MouseEvent。 (我将发布后来实现此目的的代码,因为我并非100%相关)
我意识到DisabledListItemRenderer
通常会被使用,但我不确定如何使用ComboBox.removeItem()
查找ComboBox
或DataProvider
(如上所述)。
以下是我的一些问题:
我可以查看elementsID
中ComboBox
条目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);
}
}
}
答案 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"];
}