DojoX Mobile ListItem загружает HTML через AJAX, а затем удаляет из DOM

Допустим, в представлении у меня есть элемент ListItem DojoX Mobile, который загружает фрагмент представления HTML в DOM через AJAX, а затем переходит к этому представлению. Предположим, что все работает нормально.

Теперь я возвращаюсь к исходному представлению, в котором был этот ListItem, и нажимаю другую кнопку, которая уничтожает этот узел представления из DOM. Если я сейчас нажму на тот ListItem, который ранее загрузил этот узел представления в DOM (который теперь был удален), он попытается перейти к представлению, которого не существует. Он не знает, что он был удален.

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


person mccrager    schedule 24.05.2012    source источник
comment
я нахожу немного странным, что вы хотите удалить что-то «вручную» в представлении. Но подумайте, что вам нужно _не уничтожить DOM, а вместо этого из родительского элемента ListItem, о котором идет речь, удалить указанный дочерний элемент. Итак, ваше представление исчезнет - возможно, это не то, что вы хотите, тогда вместо удаления DOM/дочернего элемента просто вызовите ListItem.set(href, newcontentsurl)   -  person mschr    schedule 24.05.2012
comment
Я хотел удалить все представление из DOM, которое было загружено через AJAX из ListItem, потому что в представлении есть данные, доступные только после входа в систему. Таким образом, пользователь нажимает «Выход», и представление, созданное после входа, будет уничтожено. . Но ListItem не знает, что фрагмент представления HTML, который был ранее загружен и уничтожен, недоступен для перехода.   -  person mccrager    schedule 01.06.2012


Ответы (2)


Я пошел другим путем и оставил представление в DOM, а просто создал функцию, которая очищает представление от всех конфиденциальных данных.

person mccrager    schedule 01.06.2012
comment
в целом было бы приемлемо выполнить перезагрузку страницы после входа/выхода. таким образом, ваша серверная часть решает, какая информация действительна для отображения с использованием сеанса входа в систему. но я уверен, что у вас были бы причины этого не делать :) - person mschr; 01.06.2012
comment
Нет серверной части, это мобильное приложение, полностью клиентское. Перезагрузок страниц тоже нет. Он загружает одну HTML-страницу, а затем этот AJAX загружает все необходимые фрагменты представления в DOM. - person mccrager; 01.06.2012
comment
Запросы AJAX по-прежнему считаются на стороне сервера, я понимаю, откуда вы пришли, последние 4 месяца потратили на аналогичное приложение в Sencha Touch :) Однако вход в приложение в моих приложениях всегда является «чем-то автономным» со значением «все данные грязные после вход/выход», и этот основной контейнер необходимо перезагрузить - следовательно, обновление страницы - person mschr; 01.06.2012

Хорошо, в этом случае, я думаю, вы могли бы подключить функцию onShow вашего контейнера ListItem (или любое другое событие onchange). Создайте прослушиватель для указанного дескриптора, чтобы оценить, нуждается ли ваш элемент в перезагрузке. Далее предполагается, что отображается содержимое item.onclick, а не метка вашего элемента, которая содержит эту информацию.

Или, что еще лучше, сделайте все это во время инициализации, чтобы ваш контейнер ListItem был расширен с помощью пользовательского кода onClick.

Кажется простым, но может привести к некоторым причудам, где/когда/если вы программно переходите к этому элементу, однако здесь говорится:

function checkItem() {
    // figure out if DOM is present and if it should be
    if( isLoggedIn() ) {
       this.getChildren().forEach(function(listitem) {
        if( dojo.query("#ID_TO_LOOK_FOR", listitem.domNode).length == 0 ) {
           // this references the listItem, refresh contents.
           // Note: this expects the listitem to be stateful, have no testing environment at time being but it should be
           listitem.set("url", listitem.url);
        }


       });
    }
}

Желательно установить это в своей конструкции контейнера для ваших ListItems

var listItemParent = new dojox.mobile.RoundRectList({
  onShow : checkItem,
  ...
});

Или создайте прослушиватель

var listItemParent = dijit.byId('itemRegistryId');
// override onClick - calling inheritance chain once done
dojo.connect(listItemParent, "onClick", listItemParent, checkItem);
person mschr    schedule 01.06.2012