1

我正在应用程序中构建列表/网格控件并在Web 应用程序Flex中使用它。.NET长话短说,我从序列化对象的 Web 服务中获取 XML。我有一个页面上可以有多少东西的页面限制。我采用了一个数据网格并将其制成页面,跨页面排序,并处理一些基本过滤。

关于分页,我使用在页面上键入的 Dictionary 并存储该页面的 XML。这样,每当用户返回我保存到此字典中的页面时,我都可以从本地内存中获取 XML,而不是访问 web 服务。基本上,我正在缓存从每次调用 web 服务中检索到的数据以获取一页数据。

有几件事可以使我的缓存过期。过滤和排序是主要原因。但是,用户可以通过打开编辑器来编辑网格中的一行数据。他们编辑的数据可能会导致行中显示的数据过时。我可以轻松地访问 Web 服务并获取整个数据页面,但由于页面大小是在运行时设置的,因此我可能会查看大量要检索的记录。

因此,现在让我谈谈我遇到的问题的核心。为了防止取回整个数据页面,我调用了 web 服务,请求完全更新的记录(编辑器处理保存其数据)。

由于我使用的是自定义对象,因此我需要在服务器上将它们序列化为 XML(这已经为我们软件的其他部分处理了)。所有数据都通过 e4x 中的 XML 处理。Dictionary 中的缓存存储为 XMLList。

现在让我向您展示我的代码...

var idOfReplacee:String = this._WebService.GetSingleModelXml.lastResult.*[0].*[0].@Id;
var xmlToReplace:XMLList = this._DataPages[this._Options.PageIndex].Data.(@Id == idOfReplacee);

if(xmlToReplace.length() > 0)
{
    delete (this._DataPages[this._Options.PageIndex].Data.(@Id == idOfReplacee)[0]);
    this._DataPages[this._Options.PageIndex].Data += this._WebService.GetSingleModelXml.lastResult.*[0].*[0];
}

基本上,我得到了要替换的节点的 id。然后我在缓存的 Data 属性 ( XMLList) 中找到它。我确保它存在,因为第二行的过滤器返回XMLList.

我遇到的问题是删除行。我无法使该行从列表中删除该节点。删除行之后的行有效。我已将节点添加到列表中。

如何替换或删除该节点(即我从缓存的 .Data 属性中的过滤语句中找到的节点)???

希望我所有变量的下划线在发布时都不会被转义!否则this.&#95 == this._

4

4 回答 4

2

谢谢你们的答案。

@Theo:我尝试了几种不同的替换方式。由于某种原因,它永远不会出错,但永远不会更新列表。

@Matt:我想出了一个解决方案。问题不是来自您的建议,而是来自删除如何与列表一起使用(至少在这种情况下我是如何拥有它的)。

_DataPages 字典对象的 Data 属性是定义节点的列表(通过之前对另一个 XML 文档的过滤获得)。

<Models>
     <Definition Id='1' />
     <Definition Id='2' />
</Models>

我最终做了这个小交易:

//gets the index of the node to replace from the same filter
var childIndex:int = (this._DataPages[this._Options.PageIndex].Data.(@Id == idOfReplacee)[0]).childIndex();
//deletes the node from the list
delete this._DataPages[this._Options.PageIndex].Data[childIndex];
//appends the new node from the webservice to the list
this._DataPages[this._Options.PageIndex].Data += this._WebService.GetSingleModelXml.lastResult.*[0].*[0];

所以基本上我必须在 XMLList 中获取节点的索引,即 Data 属性。从那里我可以使用 delete 关键字将其从列表中删除。+= 将我的新节点添加到列表中。

我非常习惯使用 ActiveX 或 Mozilla XmlDocument 的东西,你称之为“SelectSingleNode”,然后使用“replaceChild”来做这种事情。哦,好吧,至少这是在其他人可以找到的某个论坛中。我不知道当我回答自己的问题时会发生什么。也许这种见解会帮助其他人出现并帮助更好地回答问题!

于 2008-08-14T19:06:41.337 回答
1

也许你可以replace改用?

var oldNode : XML = this._DataPages[this._Options.PageIndex].Data.(@Id == idOfReplacee)[0];
var newNode : XML = this._WebService.GetSingleModelXml.lastResult.*[0].*[0];    

oldNode.parent.replace(oldNode, newNode);
于 2008-08-14T13:58:33.923 回答
1

我知道这是一个非常古老的问题,但我没有看到(我认为是)这个问题的最简单解决方案。

Theo 在这里有正确的方向,但是在使用 replace 的方式上存在许多错误(事实上,E4X 中的几乎所有东西都是一个函数)。

我相信这会成功:

oldNode.parent().replace(oldNode.childIndex(), newNode);

replace()可以在第一个参数中采用多种不同的类型,但 AFAIK,XML 对象不是其中之一。

于 2016-05-04T13:28:44.620 回答
0

我没有立即看到问题,所以我只能冒险猜测。delete你得到的那一行正在寻找列表顶层的第一个项目,它的属性“Id”的值等于idOfReplacee. 确保您无需深入研究 XML 结构即可找到匹配的 id。

试试这个:

delete (this._DataPages[this._Options.PageIndex].Data..(@Id == idOfReplacee)[0]);

(注意 '.' 之后的额外Data)。您可以通过在您发布的代码的第二行设置断点来更轻松地调试它,并确保 XMLList 看起来像您期望的那样。

于 2008-08-14T13:55:29.920 回答