Я создаю элемент управления listing/grid в приложении 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];
}
По сути, я получаю id узла, который хочу заменить. Затем я нахожу его в свойстве Data кэша (XMLList
). Я убеждаюсь, что он существует, поскольку фильтр во второй строке возвращает XMLList
.
Проблема у меня возникает со строкой delete. Я не могу заставить эту строку удалить узел из списка. Строка, следующая за строкой delete, работает. Я добавил узел в список.
Как мне заменить или удалить этот узел (имеется в виду узел, который я нахожу из оператора фильтрации из свойства .Data кэша)?
Надеюсь, что подчеркивания для всех моих переменных не останутся без символов, когда это будет опубликовано! иначе this._ == this
._
Спасибо за ответы, ребята.
@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", чтобы делать такие вещи. Ну, по крайней мере, это есть на каком-то форуме, где кто-то другой может найти это. Я не знаю, что происходит, когда я отвечаю на свой собственный вопрос. Возможно, эта информация поможет кому-то другому лучше ответить на вопрос!
Возможно, вместо этого вы можете использовать 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);
Я знаю, что это очень старый вопрос, но я не'т см. (Я думаю) самое простое решение этой проблемы.
Тео был в правильном направлении, но там'ы ряд ошибок с КАК ЗАМЕНИТЬ используется (и тот факт, что практически все в e4x является функция).
Я считаю, что это будет делать трюк:
oldNode.parent().replace(oldNode.childIndex(), newNode);
`заменить () может принимать ряд различных типов в первом параметре, но объекты, насколько я знаю, XML не один из них.
Я не сразу вижу проблему, поэтому могу только предположить. Строка delete
, которую вы получили, ищет первый элемент на верхнем уровне списка, который имеет атрибут "Id" со значением, равным idOfReplacee
. Убедитесь, что вам не нужно углубляться в структуру XML, чтобы найти этот подходящий id.
Вместо этого попробуйте следующее:
delete (this._DataPages[this._Options.PageIndex].Data..(@Id == idOfReplacee)[0]);
(Обратите внимание на лишнюю '.' после Data
). Вы можете более легко отладить это, установив точку останова на второй строке кода, который вы опубликовали, и убедиться, что XMLList выглядит так, как вы ожидаете.