Flex里的XML类没有 [多次] 移动接口??似乎Flex官方 是一严重的bug

黄传通 2009-04-23 09:20:16
情况如下:

<mx:Tree id="tree1" dataProvider={m_data}/>
<mx:Script>
<![CDATA[

[Bindable]
public var m_data:XML = null;


public function init():void
{
//这里初始化m_data;
m_data = <root>
<folder id ="-1">
<folder id = "0"/>
<folder id= "1"/>
</folder>
<folder id="2"/>
<folder id="3"/>
<folder id="4"/>
<folder id="5"/>
<root/>
}
function fun1():void{
var node:XML = m_data..*.( @id="1");//找到id==1的节点
node.appendChild(<folder id="new"/>); //这里就会出现加不进m_data中,只有第一次调用时行,多行就不行了。

}
function fun2():void{
var node:XML = m_data..*.( @id="1")
delete node.folder[0]); //这里就能删除

}
function move:void{
fun1(); fun2();
fun1(); fun2();
fun1(); fun2();
//对m_data进行增删。移动等操作。
}
]]>
</mx:Script>



据说XML没有实现增删接口,那句 “只能删除动态增加的属性”。不能这样写 delete m_data.child() ,我寒阿。。

其实我上面的操作是失败的。当我多次appendChild里,就会出现加不进去的结果 。

Tree控件的标准用法是否:数据源由XMLListCollection类提供?为何?

我理解 XMLListCollection 是一平面二维结构。[0]、[1]、[2]、、由 addItem() 方法增加。
里面保存是 XMLList or XML

而XMLList只有一个元素,即只有下标[0],[0]是XML类型。

XMLListCollection 实现的 removeAll, removeItem, addItem 这些接口?这是什么意思?

XMLList, XML 没有这些接口, 只有XML.appendChild(), 没有 XML.removeChild(),

个人理解 delete XML.Child 这样的做法是不正确的删除结点方法?对吗?











...全文
288 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
黄传通 2009-05-20
  • 打赏
  • 举报
回复
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="init();" >
<mx:Script>
<![CDATA[

import mx.events.DragEvent;
import mx.events.ListEvent;
import mx.core.SpriteAsset
import mx.core.UITextField
import mx.core.UIComponent;
import mx.controls.treeClasses.TreeItemRenderer;
import mx.controls.Tree;
import flash.ui.ContextMenu;
import flash.ui.ContextMenuItem;

[Bindable]
public var treeData: XML = null;

private function init():void
{
treeData = <root>
<node label="Massachusetts" type="state" data="MA">
<node label="Boston" type="city" />
</node>
<node label="California" type="state" data="CA">
<node label="San Francisco" type="city" >
</node>
</node>
</root>;
treeFileContextMenuInit();
}

private var bMove:Boolean = false;
private function tree_contextMenu_move(event:Event):void
{
var strNode:String = "California";
if (bMove)
strNode = "Massachusetts";
bMove = !bMove;

var item:XMLList = treeData..*.(hasOwnProperty("@label") && @label == "Boston");
if (item.length() > 0)
{
var item2:XML = treeData..*.(hasOwnProperty("@label") && @label == strNode)[0];
item2.appendChild(item[0].copy());
delete item[0];
}
}
private function treeFileContextMenuInit():void
{
var contextMenu: ContextMenu = new ContextMenu();
contextMenu.hideBuiltInItems();
contextMenu.builtInItems.print = true;
contextMenu.addEventListener(ContextMenuEvent.MENU_SELECT, tree_menu_SelectHandler);
var itemDel:ContextMenuItem = new ContextMenuItem("move");
itemDel.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, tree_contextMenu_move);
itemDel.separatorBefore = true;
contextMenu.customItems.push(itemDel);
this.tree.contextMenu = contextMenu;
}

private function tree_menu_SelectHandler(event:ContextMenuEvent):void
{
var Renderer:Object = null;
if ( event.mouseTarget is mx.core.UITextField )
{
Renderer = (event.mouseTarget as UITextField).owner;
}
else if (event.mouseTarget is mx.core.SpriteAsset)
{
Renderer = (event.mouseTarget as SpriteAsset).parent;
}

if (Renderer is TreeItemRenderer)
{
var sitem:Object = (Renderer as TreeItemRenderer).data;
this.tree.selectedItem = sitem as XML; //这里就会出现 15超时,就我是所说的bug
}
}

]]>
</mx:Script>


<mx:XMLListCollection id="treeCollection" source="{treeData.node}"/>

<mx:Panel x="48" y="125" width="447" height="351" layout="absolute" title="Tree">

<mx:Tree width="186" left="10" top="10" bottom="10" id="tree"
labelField="@label"
dataProvider="{treeCollection}"
/>


</mx:Panel>
</mx:Application>



这个例子会引起这个bug.....


操作:
1.右键菜单:move
2.再右键菜单:move
3.再一次右键菜单:move
黄传通 2009-04-27
  • 打赏
  • 举报
回复
herowach,回答得甚是也。。。。我最后是:先对其copy()执行增删操作,同时记录下openItems属性,再赋给其copy()
herowach 2009-04-27
  • 打赏
  • 举报
回复
XML貌视没有直接移动结点的方法,你可以自己写一个方法做这个功能,你上面的例子我运行了下,没什么问题啊,你说的哪里会有问题,你可以写一个小的有问题的测试程序看看,Tree的是否展开记录是可以记录下来的,当前所有打开的节点都存进openItems属性里了,你要是想还原原来的状态,可以操作前记录那个属性,然后再赋回去
黄传通 2009-04-26
  • 打赏
  • 举报
回复
还是疑惑当中
ET郭强 2009-04-25
  • 打赏
  • 举报
回复
学习下
俊牧 2009-04-24
  • 打赏
  • 举报
回复
very simple :-)
xml.setChildren("");即可
黄传通 2009-04-24
  • 打赏
  • 举报
回复
谢谢LS的回答
回LS,我没说这个程序能跑,我只是写个伪代码。。。

我实际项目确实有这个问题存在,我这里有好几Flex的程序员,也看到我所在展现的BUG

我最用是用 var node = xml.copy() 对其copy进行移动才实现效果 。

但这样引进Tree控件自动缩起来
黄传通 2009-04-24
  • 打赏
  • 举报
回复
没人来,我再顶
herowach 2009-04-24
  • 打赏
  • 举报
回复
这个程序你能跑???随便看一下,都好几个错误了
1、Tree没设labelField,最后会造成只有一个结点;
2、<root/> 应该是</root>;
3、m_data..*.( @id="1"); 带条件的结点查询,返回的是一个XMLList,比较要在最后加上[0]取指定结点,@id="1"应该是@id=="1");

XML,XMLList、Array等可以看做基本集合类型,XMlListCollection和ArrayCollection才是真正的集合类型(自己理解);
XMLListCollection是多层嵌套的树形集合,不是一平面二维结构,XMLList就算只有一个元素,也要加上下表[0]才能当做XML使用,否则编译器会认为类型不匹配,removeAll, removeItem, addItem都是集合的操作方法,删除ARRAY和XML中的元素,就是通过关键字delete的,不是所谓的“不正确”的删除方法,并且多次appendChild没有任何问题,你把上面的几个错误改了应该就可以运行了,自己再试试吧
黄传通 2009-04-23
  • 打赏
  • 举报
回复
自己顶顶先

4,327

社区成员

发帖
与我相关
我的任务
社区描述
多媒体/设计 Flex
社区管理员
  • Flex
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧