Проблема понимания функции фильтра - PullRequest
0 голосов
/ 01 февраля 2019

Здесь приведены функции для добавления фильтра и функции панели поиска на страницу.

У меня проблемы с пониманием данной функции onFilterInvoices, используемой для фильтрации списка, отображаемого на экране.

#InvoiceList.controller.js
sap.ui.define([
    "sap/ui/core/mvc/Controller",
    "sap/ui/model/json/JSONModel",
    "../model/formatter",
    "sap/ui/model/Filter",
    "sap/ui/model/FilterOperator"
], function (Controller, JSONModel, formatter , Filter, FilterOperator) {
    "use strict";
    return Controller.extend("Workspace.controller.InvoiceList", {
        formatter: formatter,
        onInit : function () {
            var oViewModel = new JSONModel({
                currency: "EUR"
            });
            this.getView().setModel(oViewModel, "view");
        },
        onFilterInvoices : function (oEvent) {

            var aFilter = [];
            var sQuery = oEvent.getParameter("query");
            if (sQuery) {
                aFilter.push(new Filter("ProductName", FilterOperator.Contains, sQuery));
            }           
            var oList = this.byId("invoiceList");
            var oBinding = oList.getBinding("items");
            oBinding.filter(aFilter);
        }
    });
});

Вы можете сослаться на Filtering code

1 Ответ

0 голосов
/ 01 февраля 2019

Позвольте мне попытаться объяснить.Сначала прочитайте: sap.ui.model.Filter

Давайте рассмотрим:

new Filter("ProductName", FilterOperator.Contains, sQuery)

Фильтру нужно 3 вещи:

  1. Где искать данные.

  2. Как просматривать данные.

  3. Что посмотретьdata.

Давайте применим это:

Итак, мы создаем фильтр,

  1. , который будет искать свойство ProductName (в котором хранится название продукта) в нашей модели, которая привязана к нашему списку.

  2. Теперь нужно уметь выглядеть.В основном операции.Эти операции могут быть contains, equals, greater than, less than и т. Д. Итак, мы говорим,

    if ( ProductName.indexOf() > -1 ) { return ProductName; }

  3. Что посмотретьдля данных (то, что пользователь вводит в поле ввода поиска).Как вы можете, в приведенном выше коде, indexOf нужен параметр.sQuery - это тот параметр.Итак, давайте завершим наш код:

    if ( ProductName.indexOf(sQuery) > -1 ) { return ProductName; }

Вышеприведенный оператор выполняется один раз для всех элементов модели (подробнее ниже) и, следовательно, всякий раз, когдаПри выполнении вышеуказанного условия этот элемент в возвращаемом элементе связывается со списком.

Здесь необходимо учитывать два момента:

  1. Мой список привязан к определенному пути.Действительно ли нужно перебрать все данные в модели?Нет. Ему нужен путь в модели, к которому привязан список.Следовательно, нам нужна привязка списка, которая укажет путь.Попробуйте это и посмотрите, сколько информации в магазинах хранится о привязке:

console.log(oList.getBinding("items"));

Если моя модель связана с несколькими списками, должна ли фильтрация в 1 списке влиять на другие места?Нет, только там, где я искал.Следовательно, нам не нужно применять фильтр к модели, но к привязке списка, специфичной для списка.Просто обновите список, который я пытаюсь отфильтровать.Следовательно, мы получаем привязку списка, используя:

oList.getBinding('items').

Теперь код: oBinding.filter(aFilter);.

Это вызов API UI5: Эй, я хочу применить фильтр к этой конкретной привязке списка (показывать только совпадающие элементы).Вот фильтры (массив) в качестве параметра.Затем UI5 выполняет фильтр и обновляет интерфейс.

Надеюсь, это поможет.

...