当我在一个Alert.show
的函数中使用DataGridEvent
时,我有一种奇怪的行为。
执行Alert.show
时,该功能运行两次。
这是代码:
private function onItemEnd(event:DataGridEvent):void
{
var pattern:RegExp =/[^a-z0-9A-ZéèçàêïôëËÉÊÈìíîïÌÍÎÏÇùúûü]/;
var res:Boolean=pattern.test(texteSaisi);
if(res==true){
event.reason = DataGridEventReason.CANCELLED;
Alert.show("Le nom de l'option ne doit pas contenir des caractère spéciaux.");
}else{
if (event.dataField == "libelle"){
question.libelle = texteSaisi;
}else if (event.dataField == "description") {
question.description = texteSaisi;
}
<mx:DataGrid
draggableColumns="false"
dataProvider = "{model.obtenirListeOptionsTarificationProposition}"
id = "gridOptions"
rowCount = "10"
doubleClickEnabled = "true"
itemClick = "onItemClick(event)"
change = "onChange(event)"
width = "80%"
editable = "true"
itemEditEnd = "onItemEnd(event)">
当调用此函数时,我在屏幕上有两个警报,我不知道为什么。
答案 0 :(得分:2)
我怀疑将警报与itemEditEnd
事件结合使用是有问题的。写了一个简单的测试用例,其表现不同(我似乎进入了无限循环)。
问题在于:
可以通过多种方式调度itemEditEnd
事件:键盘交互(在编辑单元格时按Tab键或按Enter键),鼠标交互等等。
我开始编辑单元格。然后我点击tab / enter或点击另一个单元格。这会生成itemEditEnd
事件,会将焦点移至新的可编辑单元格。
在itemEditEnd
事件的事件处理程序中,显示Alert
。此弹出窗口会从该可编辑单元格中移除焦点...从而调度第二个itemEditEnd
事件。
在我下面的测试应用中,我实际上创建了一个无限循环。
如果您需要在itemEditEnd
事件后显示警告,也许您可以在事件处理程序中放置一些逻辑(因此它会在第二次立即返回)。
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
minWidth="955" minHeight="600"
creationComplete="onCreationComplete()">
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.controls.Alert;
private function onCreationComplete():void
{
grid.dataProvider=createCollection();
}
private function createCollection():ArrayCollection
{
var tmp:Array = [];
for (var i:int = 1; i<11; i++)
{
tmp.push({ data: Math.random()*100, label: i.toString() + " label" });
}
return new ArrayCollection(tmp);
}
private function onItemEditEnd():void
{
Alert.show("item edit end");
}
]]>
</fx:Script>
<mx:DataGrid id="grid" itemEditEnd="onItemEditEnd()" editable="true" />
</s:Application>
答案 1 :(得分:0)
我通过在第一次触发警报时将布尔值设置为true来解决问题,然后如果用户尝试更改onter行中的其他项目,则在点击处理程序中将其设置为false。
请求帮助;)