SapUI5: Нажатие по заголовку колонки таблицы / click on column header sap.m.Table
Привет!
При визуализации данных очень часто приходиться использовать таблицы. Но стандартные решения не всегда покрывают потребности заказчика.
В данном посте разберем как сделать сортировку и поиск по клику на столбец таблицы.
Пример, который мы будем рассматривать ниже, можно импортировать в свой WebIDE отсюда https://github.com/kannade/sapui5_click_header_column_table.
За реализации спасибо https://blogs.sap.com/2016/08/22/responsive-sapm-table-on-click-column-sort-filter/. Пример работы из ссылки — http://plnkr.co/edit/YKiSLvByFwjE6kMwE0Yl?p=preview.
В качестве примера возьмем уже заполненную таблицу из примеров в документации sapui5: https://sapui5.hana.ondemand.com/#/sample/sap.m.sample.Table/code.
и импортируем в свой WebIDE:
.
Первое, что нам необходимо сделать — на все заголовки колонок повесить событие, которое будет вызываться при клике на этот заголовок:
onAfterRendering: function () { var oTab = this.getView().byId("idProductsTable"); //после отрисовки таблицы возьмем все колонки и добавим им событие click oTab.addEventDelegate({ "onAfterRendering": function (id) { var that = this; var oHeader = this.getView().$().find(".sapMListTblHeaderCell"); //Get hold of table header elements for (var i = 0; i < oHeader.length; i++) { var oID = oHeader[i].id; that.onClick(oID); } }.bind(this) }, this); }, |
После отрисовки таблицы получим все заголовки по классу sapMListTblHeaderCell, возьмем их ID и вызовем метод onClick(), в котором повесим событие click по выбранному id:
onClick: function (oID) { var that = this; $("#" + oID).click(function (oEvent) { //добавим событие "click" к колонке var oTarget = oEvent.currentTarget; //Get hold of Header Element var oLabelText = oTarget.childNodes[0].textContent; //Get Column Header text var oIndex = oTarget.id.slice(-1); //Get the column Index var oView = that.getView(); var oTable = oView.byId("idMyReqTable"); //var oModel = oTable.getModel().getProperty("/ProductCollection"); //Get Hold of Table Model Values //var oKeys = Object.keys(oModel[0]); //Get Hold of Model Keys to filter the value //oView.getModel().setProperty("/bindingValue", sap.ui.getCore().byId(oEvent.currentTarget.id).data("key")); //Save the key value to property oView._bindingValue = sap.ui.getCore().byId(oEvent.currentTarget.id).data("key"); // запомним название поля в модели that._oResponsivePopover.openBy(oEvent.target); }, |
Так же мы описали действия, которые будут выполняться после клика на заголовок колонки таблицы. После нажатия мы будем запоминать колонку, на которую нажали, в глобальную переменную oView._bindingValue и открывать всплывающую подсказку, которую описали в фрагменте TableSorter.fragment.xml и создали при инициализации контроллера:
onInit: function () { // set explored app's demo model on this sample var oModel = new JSONModel(jQuery.sap.getModulePath("sap.ui.demo.mock", "/products.json")); this.getView().setModel(oModel); //создадим всплывающее окошко if (!this._oResponsivePopover) { this._oResponsivePopover = sap.ui.xmlfragment("sap.m.sample.Table.TableSorter", this); //this._oResponsivePopover.setModel(this.getView().getModel()); } }, |
Обратите внимание, что название столбца мы получаем, используя customData, про которые я напишу отдельную записку.
В примере по ссылке в начале поста используется немного другой подход, который работает только если у Вас JSON модель, в своем продуктивном приложении я биндил oData модель на таблицу, поэтому моя реализация получения ключа отличается от примера.
После открытия всплывающего окошка вызывается метод onOpen (свойство afterOpen=»onOpen»):
onOpen: function (oEvent) { //On Popover open focus on Input control var oPopover = sap.ui.getCore().byId(oEvent.getParameter("id")); var oPopoverContent = oPopover.getContent()[0]; var oCustomListItem = oPopoverContent.getItems()[2]; var oCustomContent = oCustomListItem.getContent()[0]; var oInput = oCustomContent.getItems()[1]; oInput.focus(); oInput.$().find(".sapMInputBaseInner")[0].select(); }, |
который устанавливает указатель мыши в поле поиска.
После выбора сортировки или поиска будет отрабатывать соответствующий метод. Поиск — onChange, сортировки — onDescending, onAscending.
Все три метода похожи, посмотрим на onAscending:
onAscending: function (evt) { var oTable = this.getView().byId("idProductsTable"); //Получим таблицу var oItems = oTable.getBinding("items"); //Возьмем биндинг (элементы таблицы) // var oBindingPath = this.getView().getModel().getProperty("/bindingValue"); var oBindingPath = this.getView()._bindingValue; //Получим ранее сохраненное название столбца var oSorter = new Sorter(oBindingPath); //Создадим новую сортировку oItems.sort(oSorter); //Применим сортировку для элементов таблицы this._oResponsivePopover.close(); //закроем всплывающее окошко }, |
Вот так довольно просто и быстро можно реализовать сортировку и поиск по клику на заголовок столбца таблицы!
Домашнее задание: при помощи css изменить иконку мыши на «poiner» при наведении на заголовок колонки таблицы :).
Привет!
Подскажи, пожалуйста, как данный пример стартануть в SAP Web IDE Full Stack?
Пытался запустить чистый проект в GitHub, а также скопировать код в стандартный сгенерированный пример — результат не утешительный….
Андрей, а в чем, собственно, проблема?
Тут https://nickcode.ru/sapui5/urok-3-sapui5-sap-web-ide-predstavleniya-views.html в картинках описан процесс, но, там еще не было Full Stack…
В SAP Web IDE Full Stack правой кнопкой мыши на вкладке «Workspace» -> Git -> Clone Repository.