Доступ к содержимому элемента ItemTemplate NativeScript ListView

Я использую NativeScript <ListView> и пытаюсь получить доступ к отдельным элементам в каждом элементе <ListView.itemTemplate>. Чтобы привести конкретный пример, учитывая этот фрагмент кода, как мне получить доступ к каждому <GridLayout>?

<ListView>
  <ListView.itemTemplate>
    <GridLayout>...</GridLayout>
  </ListView.itemTemplate>
</ListView>

Я знаю, что могу добавить событие loaded к каждому <GridLayout>, т.е. <GridLayout loaded="myEventHandler"> — однако в моем случае мне нужно изменить атрибуты <GridLayout> после того, как произойдет несвязанное событие.

Теоретически я мог бы использовать событие loaded для создания массива всех <GridLayout> в <ListView.itemTemplate>, а затем использовать этот массив для выполнения действий, но это кажется хакерским. Кажется, должен быть лучший способ. Любые идеи?


person TJ VanToll    schedule 04.04.2016    source источник


Ответы (3)


Вы можете использовать плагин nativescript-dom. На самом деле у getElementsByClassName есть код для обхода дочерних элементов ListView. К сожалению, после того, как я обнаружил проблему и поместил отчет об ошибке в репозиторий NS Common Components, я совершенно забыл внести те же изменения в функции getElementsByTagName и getElementById в плагине nativescript-dom.

Поэтому использование getElementsByClassName, если вы назначите ему имя класса, должно работать прямо сейчас. В противном случае; Я, вероятно, сделаю обновление библиотеки позже на этой неделе, в котором будет код обхода дочерних элементов listview для двух других методов.

Обновление: я выпустил новую версию nativescript-dom, которая позволяет всем трем элементам getElement* работать с дочерними элементами ListView.

person Nathanael    schedule 04.04.2016

Манипулирование визуальным деревом для элемента представления списка здесь не кажется самым надежным подходом. Рассмотрим следующий сценарий:

  1. Элемент отображается на экране.
  2. Ваш код запускается и изменяет дерево визуального контейнера.
  3. Пользователь прокручивает или происходит что-то еще, и представление списка повторно использует визуальный контейнер для другого элемента. Теперь ваш новый предмет выглядит сломанным.

Я бы реализовал это с помощью привязок и, если что-то пойдет не так, подходящей модели представления, которая делает привязки простыми.

person Hristo Deshev    schedule 05.04.2016

Я думаю, вы можете динамически предоставлять каждому gridview и id, используя что-то вроде id="gridView{{$index}}", а затем использовать, например, page.getViewById('gridView1'). Пока не могу проверить, но думаю, что сработает.

person JoshSommer    schedule 04.04.2016
comment
Это умная идея, но, к сожалению, она не работает. Если я попробую getElementById, он не сможет найти элементы в шаблонах. Как будто их вообще нет в визуальном дереве. - person TJ VanToll; 04.04.2016