Удаление / замена узла в E4X (AS3 - Flex)

Я создаю элемент управления списком / сеткой в 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._

14.08.2008 12:27:00
4 ОТВЕТА

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

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

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

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

0
14.08.2008 13:55:29

Возможно, вы могли бы использовать 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);
1
14.08.2008 13:58:33

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

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

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

2
11.08.2012 15:51:46

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

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

Я верю, что это сделает свое дело:

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

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

1
4.05.2016 13:32:36