0

我遇到了一个问题,我的子元素在图表中与其自身一起移动,其中它有多个不同级别的父元素。这有点奇怪,我认为这可能是为了说明它是同一个元素,但它在我的数据网格中看起来很奇怪,有时它会从网格中分离出来!

编辑:我知道这是因为我使用的是同一个对象,但我想在两个位置使用同一个对象,这样当我单击任何一个时,我都会得到相同的 dg.selectedItem。我正在寻找一种方法来防止在两个对象而不是一个对象上发生树内移动(如果可能),而不是使用不同的对象。

我已将其简化为这段代码以说明问题:

<?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="init()">

    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;

            [Bindable] var ac:ArrayCollection;

            public function init():void
            {
                ac = new ArrayCollection();
                var objWithMultipleParents:Object = {name:"Awkward family tree"};
                ac.addItem({
                    name:"Parent 1",
                    children:[
                        objWithMultipleParents,
                        {name:"Child of Parent 1"}  
                    ]
                });
                ac.addItem({
                    name:"Parent 2",
                    children:[
                        {name:"Child of Parent 2",children:[objWithMultipleParents]},
                        {name:"Child #2 of Parent 2"}
                    ]
                });
            }

        ]]>
    </fx:Script>

    <mx:AdvancedDataGrid id="dg" width="100%" height="100%">
        <mx:dataProvider>
            <mx:HierarchicalData source="{ac}" />
        </mx:dataProvider>
        <mx:columns>
            <mx:AdvancedDataGridColumn dataField="name" headerText="Groups"/>
        </mx:columns>
    </mx:AdvancedDataGrid>
</s:Application>

在扩展父 2 的子 1 之前:

在扩展父 2 的子 1 之前

扩展父 2 的子 1 后:

扩展父 2 的子 1 后

有没有办法防止这种情况?

4

3 回答 3

1

答案是不。您不能根据需要在多个地方显示相同的项目。您将遇到像您上面所说的那样的小 UI 怪癖。但是,您可以显示该项目的平面副本,然后使用某种形式的唯一标识符访问该项目。

//store item reference in accessible object
obj = new Object();
obj[itemRef.uid] = itemRef;

//copy enough information to display and re-access correctly
copy1.name = itemRef.name;
copy1.uid = itemRef.uid;
parent1.add(copy1);

copy2.name = itemRef.name;
copy2.uid = itemRef.uid;
parent2.add(copy2);

//on item selection, access it through uid
itemRef = obj[dg.selectedItem.uid];

如果您没有任何类型的 UID,并且不想创建一个,您也可以使用平面副本作为项目键。

//make copies
copy1.name = itemRef.name;
copy2.name = itemRef.name;
parent1.add(copy1);
parent2.add(copy2);

//map references
obj[copy1] = itemRef;
obj[copy2] = itemRef;

//re-access
itemRef = obj[dg.selectedItem];
于 2012-04-17T19:33:22.770 回答
1

树中的任何节点在树中只能出现一次。时期。节点的引用(对象 ID)标识它在树中的位置。多次添加它会破坏所有需要知道节点在树中位置的机制。只有相反的方式才会起作用(知道哪个节点在某个位置)。副作用之一是错误的缩进。当显示节点的子节点时,将计算所需的缩进并将其应用于其外观 - 在树中的所有出现处,无论它们是否处于完全不同的缩进级别。

如果你需要在不同的地方展示相同的数据,让你的树节点只是包装到一个保存数据的对象。树 ndo 是独立的对象,但从它们引用的对象中获取它们的名称、图标、工具提示、whoateever。并且这个“数据对象”可以被任意数量的树节点引用。即使需要知道单击了哪些数据,您也可以从消息中获取对树节点的引用,并从中获取对数据对象的引用以进行进一步处理。

于 2018-05-29T13:43:52.847 回答
0

好的,这是你的问题。

var objWithMultipleParents:Object = {name:"Problem"};

您正在创建一个对象并在多个位置使用。
在 AS3 中,对象是通过引用传递的。
话虽如此,如果您在一个元素中更改对象,您将在“所有”元素中更改它。
请注意,在我的示例中,我使用一个函数来创建一个新对象,而不是一遍又一遍地引用同一个对象。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
    minWidth="955" minHeight="600"
               creationComplete="init()">
<mx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;

        [Bindable]
        public var ac:ArrayCollection;

        public function init():void
        {
            ac = new ArrayCollection();
            var objWithMultipleParents:Object = createObject( );
            ac.addItem({
                name:"Parent 1",
                children:[
                    objWithMultipleParents,
                    {name:"Child of Parent 1"}  
                ]
            });
            ac.addItem({
                name:"Parent 2",
                children:[
                    {name:"Child of Parent 2",children:[createObject( )]},
                    {name:"Child #2 of Parent 2"}
                ]
            });
        }
        public function createObject( ):Object{
            return {name:"Problem"}
        }

    ]]>
</mx:Script>

<mx:AdvancedDataGrid id="dg" width="100%" height="100%">
    <mx:dataProvider>
        <mx:HierarchicalData source="{ac}" />
    </mx:dataProvider>
    <mx:columns>
        <mx:AdvancedDataGridColumn dataField="name" headerText="Groups"/>
    </mx:columns>
</mx:AdvancedDataGrid>

您也可能想查看HierarchicalData

于 2012-04-17T19:03:45.967 回答