Удаление / замена узла в E4X (AS3 - Flex) - PullRequest
1 голос
/ 14 августа 2008

Я создаю элемент управления списком / сеткой в ​​приложении Flex и использую его в веб-приложении .NET. Короче говоря, я получаю XML от веб-сервиса сериализованных объектов. У меня есть ограничение на количество страниц на странице. Я взял сетку данных и сделал ее постраничной, отсортировал по страницам и провел некоторую базовую фильтрацию.

Что касается подкачки страниц, я использую словарь на странице и храню XML для этой страницы. Таким образом, всякий раз, когда пользователь возвращается на страницу, которую я сохранил в этом словаре, я могу получить XML из локальной памяти вместо того, чтобы обращаться к веб-сервису. По сути, я кеширую данные, полученные при каждом обращении к веб-сервису, для страницы данных.

Есть несколько вещей, которые могут истечь мой кеш. Фильтрация и сортировка являются основной причиной. Тем не менее, пользователь может редактировать строку данных в сетке, открыв редактор. Данные, которые они редактируют, могут стать причиной устаревания данных, отображаемых в строке. Я мог бы легко зайти в веб-сервис и получить всю страницу данных, но, поскольку размер страницы установлен во время выполнения, я мог бы просмотреть большое количество записей для извлечения.

Итак, позвольте мне теперь понять суть проблемы, с которой я сталкиваюсь. Чтобы предотвратить возвращение всей страницы данных, я обращаюсь к веб-сервису с просьбой полностью обновить запись (редактор обрабатывает сохранение своих данных).

Поскольку я использую пользовательские объекты, мне нужно сериализовать их на сервере в XML (это уже обрабатывается для других частей нашего программного обеспечения). Все данные обрабатываются через XML в e4x. Кеш в Словаре хранится в виде 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];
}

По сути, я получаю идентификатор узла, который хочу заменить. Затем я нахожу его в свойстве Data кеша (XMLList). Я уверен, что он существует, поскольку фильтр во второй строке возвращает XMLList.

У меня проблема со строкой удаления. Я не могу заставить эту строку удалить этот узел из списка. Строка после строки удаления работает. Я добавил узел в список.

Как заменить или удалить этот узел (имеется в виду узел, который я нахожу из оператора фильтра из свойства .Data кеша) ???

Надеюсь, подчеркивания для всех моих переменных не останутся без экранирования при публикации! в противном случае this.&#95 == this ._

Ответы [ 4 ]

2 голосов
/ 14 августа 2008

Спасибо за ответы, ребята.

@ Тео: Я попробовал заменить несколько разных способов. По какой-то причине это никогда не будет ошибкой, но никогда не будет обновлять список.

@ Matt: Я нашел решение. Проблема не в том, что вы предложили, а в том, как удаление работает со списками (по крайней мере, в моем случае в этом случае).

Свойство Data объекта словаря _DataPages представляет собой список узлов определения (получен предыдущей фильтрацией другого 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», чтобы делать такие вещи. Ну, по крайней мере, это на каком-то форуме, где кто-то другой может его найти. Я не знаю, что происходит, когда я отвечаю на свой вопрос. Возможно, это понимание поможет кому-то еще прийти и поможет лучше ответить на вопрос!

1 голос
/ 04 мая 2016

Я знаю, что это невероятно старый вопрос, но я не вижу (как мне кажется,) самого простого решения этой проблемы.

У Тео было правильное направление, но есть ряд ошибок, связанных со способом замены (и тот факт, что почти все в E4X является функцией).

Я верю, что это поможет:

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

replace() может принимать несколько различных типов в первом параметре, но AFAIK, объекты XML не являются одним из них.

1 голос
/ 14 августа 2008

Возможно, вы могли бы использовать 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);
0 голосов
/ 14 августа 2008

Я не сразу вижу проблему, поэтому могу только рискнуть. Полученная строка delete ищет первый элемент на верхнем уровне списка, который имеет атрибут "Id" со значением, равным idOfReplacee. Убедитесь, что вам не нужно углубляться в структуру XML, чтобы найти соответствующий идентификатор.

Попробуйте вместо этого:

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

(обратите внимание на дополнительные '.' После Data). Вы можете легче отладить это, установив точку останова во второй строке кода, который вы опубликовали, и убедитесь, что XMLList выглядит так, как вы ожидаете.

...