Такой вариант использования элемента <vaadin-grid>
создаст плохой UX. Заголовки сетки по умолчанию не предназначены для использования с интерактивными кнопками. Поэтому они выглядят неактивными, поэтому пользователь не будет думать о них как о интерактивных ссылках или кнопках.
Что касается Vaadin Grid, пожалуйста, подумайте о том, чтобы сделать столбцы скрытыми, указав атрибут <col hidable>
. Это позволит пользователю переключать отображаемые столбцы, выбирая их в красивом раскрывающемся меню справа от заголовка сетки. См. Скрытие Например, раздел Columns в документации к сетке.
Если вы хотите переключаться между различным содержимым одним щелчком мыши, лучше вместо этого использовать элементы, специально предназначенные для этого, например <paper-tabs>
.
Ваш вариант использования было сложно реализовать, потому что требования также не разработаны в Vaadin Grid API. Мне пришлось применить несколько неприятных обходных путей, чтобы добиться этого. Пожалуйста, используйте решение для обучения, а не слепое копирование кода. Предупреждения объясняются ниже.
Как выполнить привязку для события щелчка заголовка сетки
Во-первых, в Vaadin Grid содержимое DOM не является динамическим. Они рассматриваются как начальная конфигурация и не используются непосредственно в качестве содержимого сетки. Поэтому привязать заголовок к клику в шаблоне нельзя.
В моем решении мы прикрепляем прослушиватель событий к самой сетке. Уловив щелчок по сетке, нам нужно вручную определить, был ли нажат заголовок, и найти индекс столбца, по которому щелкнули. Для этого мы:
Получите ссылку на цель события. Щелчок происходит где-то в локальном DOM сетки. event.target
вернет сетку вместо фактической цели события, если Polymer использует Shadow DOM (по умолчанию отключено). Используйте Polymer API, чтобы обеспечить правильную цель независимо от настроек Polymer:
var target: Element = (<any> window).Polymer.dom(event).rootTarget;
Проверьте цель щелчка и все элементы в дереве DOM до конца (если Polymer находится в режиме Shadow DOM) или саму сетку (если Polymer использует Shady DOM, который является режимом по умолчанию), чтобы найти элемент ячейки заголовка столбца. Для этой проверки мы используем Polymer API для проверки имени класса элемента. Мы устанавливаем собственное имя класса для заголовка первого столбца имени в методе ngAfterViewInit()
.
- If the header cell element is found, stop the search and call
this.toggleLastNameVisible();
.
- Если элемент ячейки заголовка не найден, значит, был нажат не первый заголовок сетки имени. Ничего не делать.
Обратите внимание, что мы хотим реагировать на щелчок, но мы должны прослушивать событие «mouseup» в сетке вместо события щелчка. Причина в том, что иногда сетка повторно отображает свое содержимое после щелчка по заголовку, что нарушает поиск элемента ячейки заголовка. Mouseup здесь работает, потому что он запускается до того, как щелкнет процесс сетки.
Как программно отображать и скрывать столбцы
Теперь, когда мы решили проблему привязки щелчка заголовка, нам нужно отобразить выбранный столбец и скрыть остальные. И снова мы не можем просто привязать атрибут <col [hidden]="showOrHide">
в шаблоне, а также не можем использовать *ngIf
для удаления скрытых столбцов. Поскольку содержимое DOM сетки не является динамическим.
Нам нужно было получить ссылку на элемент сетки и использовать API сетки:
@ViewChild('grid') gridRef: any;
toggleLastNameVisible(visible?: boolean) {
this._isLastNameVisible = visible !== undefined ? visible : !this._isLastNameVisible;
var grid: any = this.gridRef.nativeElement;
// Assuming that the last name is the second column
grid.set('columns.1.hidden', !this._isLastNameVisible);
}
Обратите внимание, что ссылка добавлена в шаблон: <vaadin-grid #grid ...>
Вы можете узнать больше об API сетки, прочитав Документация Vaadin Grid и Справочник по API . Надеюсь, это поможет лучше понять, как работает сетка.
person
Anton Platonov
schedule
15.07.2016