Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex Flex取消树上的更改事件_Apache Flex_Events_Tree - Fatal编程技术网

Apache flex Flex取消树上的更改事件

Apache flex Flex取消树上的更改事件,apache-flex,events,tree,Apache Flex,Events,Tree,简要说明:我正在使用Flex3.5 我有一个树组件,用作不同“页面”之间的导航菜单。 当用户单击菜单中的某个选项时,我通过在应用程序中的状态组件之间切换来切换“页面”。 问题是,当用户确实单击菜单中的某个选项时,我希望对某个组件中的某些信息进行验证。如果验证失败,我将显示一个警报,我希望阻止导航到其他页面。其中的一部分就是不更改文档的当前状态,但树组件仍然会继续更改事件,结果是页面A仍然显示在屏幕上,而树中的选定选项是页面B(用户希望导航到该页面,但由于某些信息无效而失败) 我试图找出如何取消树

简要说明:我正在使用Flex3.5

我有一个树组件,用作不同“页面”之间的导航菜单。 当用户单击菜单中的某个选项时,我通过在应用程序中的状态组件之间切换来切换“页面”。 问题是,当用户确实单击菜单中的某个选项时,我希望对某个组件中的某些信息进行验证。如果验证失败,我将显示一个警报,我希望阻止导航到其他页面。其中的一部分就是不更改文档的当前状态,但树组件仍然会继续更改事件,结果是页面A仍然显示在屏幕上,而树中的选定选项是页面B(用户希望导航到该页面,但由于某些信息无效而失败)

我试图找出如何取消树组件本身的更改事件。 我的想法不太合适:

我搜索了一个稍有不同的事件(例如'changing'或'startChange'),我可以对其调用stopPropagation()方法(因为常规的'change'事件是不可取消的),但树组件不存在任何事件

我还考虑过总是保存自己在树组件中选择的当前选项,当验证失败时,我会将树的selectedItem设置为保存的选项。这也很难看,因为这样的操作将在树上引发另一个更改事件,从而对States组件进行另一次更改,并对我已经在其中的页面进行另一次填充。那是我真的不想做的事

我还考虑过使用一个不同的组件,比如菜单(我还发现了一个垂直菜单的实现),但这似乎没有什么帮助。同样的问题也会存在

有没有合适的方法?
必须有一个最佳实践来防止提交更改过程

最终我找到了放置代码的地方,这些代码决定了每个项目的可选择性:当应该验证的信息发生更改时,我执行验证,并根据其结果为树组件中的所有项目设置一个属性,指示它们是否可以导航到。如果验证成功,则将属性设置为允许导航,如果验证失败,则将属性设置为不允许导航

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:local="*">

    <mx:Script>
    <![CDATA[
        import mx.controls.Alert;
        import mx.events.ListEvent;

        private function tree_changeHandler(event:ListEvent):void
        {
            trace("Change, selectedItem.label is: " + tree.selectedItem.label);
        }

        protected function tree_itemClickHandler(event:ListEvent):void
        {
            var data:Object = event.itemRenderer.data;
            if (!tree.isItemSelectable(data))
                Alert.show("Item \"" + data.label + "\" is not selectable");
        }

    ]]>
    </mx:Script>

    <local:MyTree id="tree" change="tree_changeHandler(event)" itemClick="tree_itemClickHandler(event)">
        <local:dataProvider>
            <mx:ArrayCollection>
                <mx:Object label="Label 1"/>
                <mx:Object label="Label 2"/>
                <mx:Object label="Label 3 (non-selectable)"/>
                <mx:Object label="Label 4"/>
            </mx:ArrayCollection>
        </local:dataProvider>
    </local:MyTree>

</mx:Application>
与Maxim一样,我扩展了树组件并重写了isItemSelectable()方法来检查指定项的这个属性,这样可以防止更改过程

保存要验证的信息的视图和保存树组件的视图(它们不一定是同一个视图)之间的访问是通过保存两个视图的presentor类完成的(我使用MVP机制)。这不是最优雅的设计,但它比我能想到的任何其他设计都要好。所谓的设计问题是视图与呈现者复杂性之间的耦合,呈现者必须处理多个视图,并且具有与视图之间交互相关的方法(而不是表示特定视图动作的方法)。从业务角度看,这两个视图是耦合的(因为一个视图中的信息会影响另一个视图中的导航树),因此呈现者会在它们之间耦合。耦合也通过presentor的接口完成,因此每个视图并不真正“知道”另一个视图

我希望它能帮助其他人

谢谢, 丹尼尔

package
{
import mx.controls.Tree;

public class MyTree extends Tree
{

    override public function isItemSelectable(data:Object):Boolean
    {
        if (!super.isItemSelectable(data))
            return false;

        var label:String = data.label;
        if (label.indexOf("non-selectable") >= 0)
            return false;

        return true;
    }

}
}