我在我的应用程序中有各种(阅读很多..)flex表单,我现在想要创建一个系统,通过该系统,如果用户修改了表单中的任何内容,则通知用户他没有保存... < / p>
现在..我不想重写我拥有的每一个表格..有没有一些很好的方法来实现它? 以某种方式扩展TextInput(和其他..)类?
感谢
答案 0 :(得分:1)
你可以进入TextInput类(和其他人)并添加该事件监听器和函数,但是你会改变SDK本身,这是一个坏主意。我会创建自定义类来扩展您使用的类,并进行查找/替换以使其更快。
答案 1 :(得分:1)
这不是经过深思熟虑但应该有用。
您可以创建一个自定义组件,让我们将其称为FormWatcher,您可以将其放在表单旁边。表单监视器将执行的操作是等待表单中的CreationComplete事件。
现在,因为我们已准备好Form,您可以使用表单的getChildren()方法来获取其中的所有FormItem。然后查看每个内部,你将获得TextInputs,Comboboxes等,你可以添加事件监听器(作为单独的组件),例如。
// THIS IS WHERE THE COMPONENT SHOULD START
protected function changeHandler(event:Event):void
{
trace ("something is dirty");
}
protected function startWatching(passTheFormHere:Form):void
{
for each (var O:Object in passTheFormHere.getChildren())
{
if (O is FormItem)
{
// Let's assume you only have a single child in one FormItem
// and always one child for simplicity
addChangeHandlerFor((O as FormItem).getChildAt(0));
}
}
}
protected function addChangeHandlerFor(someComponent:Object):void
{
// Most regular flex components send a Event.CHANGE event
// when their value is changing
// keep in mind you should check stuff, this is a simple example
(someComponent).addEventListener(Event.CHANGE,changeHandler);
}
// THIS IS WHERE THE COMPONENT SHOULD END
只需将此代码粘贴到某个表单旁边,并调用startWatching(nameOfYourForm),您应该会看到正在调用changeHandler。
还有一些说明:
1)一旦完成,你应该清理事件监听器。
2)我会创建一个组件,以便您可以像这样使用它:
<mx:Form id="form1" >
[...]
</mx:Form>
<FormWatcher form="{form1}" />
FormWatcher有一个名为“clean”的布尔值var。
3)示例非常简单,因此它仅适用于与此类似的表单:
<mx:Form id="myForm" >
<mx:FormItem>
<mx:TextInput id="someComponent1" />
</mx:FormItem>
<mx:FormItem>
<mx:CheckBox id="someComponent2" />
</mx:FormItem>
<mx:FormItem>
<mx:TextArea id="someComponent3" />
</mx:FormItem>
</mx:Form>