Пользовательский фильтр AngularJS дублирует - PullRequest
0 голосов
/ 11 декабря 2018

В настоящее время у меня возникла проблема с пользовательским фильтром.У меня есть массив объектов CVE, называемых «cves» (в моей области видимости), и для каждого элемента я генерирую строку tr в таблице, используя ng-repeat.

Вот глобальная структура CVE:

cve: {
  id: integer,
  cve: string,
  summary: text,
  description: text,
  cvss:{
    score: float,
    vector: string
  }
}

Вот мой HTML-код

<input type='text' ng-model='searchField'/>
       ....
       <tr ng-repeat="cve in cves | cveFilter:[ad_filters, searchField] as filtered_cves"
            ng-if="cves.length > 0">
            <td colspan="7" class="no-padding">
               //printing infos in a custom directive
            </td>
        </tr>
        ....

Вот мой фильтр:

.filter('cveFilter', function () {
    return function (cves, params) {
        console.log(cves);
        let items = {
            ids: params[0],//the ids (array of ids)
            text: params[1],//the text
            filtered_cves: []//the output
        };
         // for each cve, if its ID is in items.ids
         // AND if one of the property of the CVE match with items.text
         // push it to items.filtered_cves


        cves.forEach(function (cve) {
            if (
                items.ids.includes(cve.id) &&
                (
                    cve.cve.match(items.text) ||
                    cve.summary.match(items.text) ||
                    cve.description.match(items.text) ||
                    cve.cvss.score.match(items.text) ||
                    cve.cvss.vector.match(items.text)
                )
            ) {
                items.filtered_cves.push(cve)
            }
        });

        return items.filtered_cves;
    };
});

Моя проблема в следующем: мой фильтр работает, он сохраняеттолько соответствующие CVE, но каждый CVE отображается в двух экземплярах.Это означает, что если в моем массиве $ scopes.cves будет 6 cves, в моей html-таблице будет 12 строк.

Это мой первый пользовательский фильтр, но я считаю, что это глупая ошибка.

Вы знаете, где я потерпел неудачу?

Заранее благодарю,

1 Ответ

0 голосов
/ 11 декабря 2018

Это дублирует данные, я не получаю пустых строк.

Если я распечатываю содержимое $ scope.filtered_cves, я получаю (скажем, я должен получить 8) 16 элементов.

Раньше я об этом не упоминал, но $ scope.ad_filters - это массив идентификаторов CVE, которые я хочу отобразить.CVE отображается только в том случае, если его идентификатор находится в $ scope.ad_filters И если одно из его свойств совпадает с содержимым текста формы ввода.

Я не могу сделать снимок экрана в данный момент, мне нужно поставить подделкуdata.

Вот обновленный код для моего фильтра (ничего действительно не изменилось, просто добавлены некоторые функции):

.filter('cveFilter', function () {
    return function (cves, params) {
        let items = {
            ids: params[0],
            text: params[1],
            filtered_cves: []
        };

        cves.forEach(function (cve) {
            console.log(cve);
            if (items.ids.includes(cve.id)) {
                if (items.text === '' || items.text === null || items.text === undefined ||
                    (
                        cve.cve.toString().includes(items.text) ||
                        cve.summary.toString().includes(items.text) ||
                        cve.description.toString().includes(items.text) ||
                        cve.cvss.score.toString().includes(items.text) ||
                        cve.cvss.vector.toString().includes(items.text)
                    )
                ) {
                    items.filtered_cves.push(cve)
                }
            }
        });
        return items.filtered_cves;
    };
});

Я запустил его и заметил, что он выполняется несколько раз, ив последний раз он печатает вдвое больше строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...