Создание вызова API, содержащего несколько значений, выбранных фильтром, в приложении Angular

У меня есть ряд фильтров флажков в моем приложении Angular, которые при нажатии пользователем в представлении должны запускать функции, которые запрашивают API для возврата отфильтрованных результатов. У меня эти фильтры работают при использовании по одному. Однако мне трудно понять, как структурировать функцию, чтобы она могла содержать ВСЕ выбранные в данный момент фильтры. Вызов функции использует функцию Mongoose/MongoDB, которая позволяет нам передавать пары ключ/значение, соответствующие полям, непосредственно в полезную нагрузку почтового запроса.

Это то, что у меня было изначально (это работает, но только при обработке одного фильтра за раз с помощью операторов if/else). В основном это говорит о том, что если «тип» имеет значение «lan», то присвойте значение соответственно. И если значение не указано (т. е. пользователь отменил выбор всех фильтров), просто отправьте запрос на вызов API, не включая какие-либо введенные параметры (последнее «еще» здесь):

    onFilterReceived(value, type) {
        if (type === 'lan' && value) {
            this.filtersService.getByFilter(this.page, this.pagesize, {
                "services.workflow.status" : "consulting",
                "languages.primary" : { $in: value }
                });
        } else if (type === 'zip' && value) {
            this.filtersService.getByFilter(this.page, this.pagesize, {
                "services.workflow.status" : "consulting",
                "zipCode" : { $in: value }
                });
        } else {
            this.filtersService.getByFilter(this.page, this.pagesize, {
                "services.workflow.status" : "consulting"
            });
    }

Я получаю как «значение», так и соответствующий «тип», отправленный через Angular Output() и EventEmitter(), например:

        <list [records]="records"
            (sendLanguage)="onFilterReceived($event, type = 'lan')"
            (sendZipcode)="onFilterReceived($event, type = 'zip')">
        </list>

Опять же, все вышеперечисленное работает как есть.

Однако то, что я пытаюсь сделать, это построить эту функцию таким образом, чтобы, когда полученное значение имеет тип «lan», соответствующее «значение» в этом случае применялось к «значению» здесь:

"languages.primary" : { $in: value }

И затем, когда полученное значение имеет соответствующий тип «zip», это «значение» затем применяется к «значению» здесь:

"zipCode" : { $in: value }

Конечная цель состоит в том, что я смогу отправить запрос через API, который содержит значения нескольких фильтров ОДНОВРЕМЕННО.

Я пробовал множество составов, но до сих пор не смог заставить это работать так, как хотелось бы. Я использовал операторы if/else, как указано выше, но опять же, это позволит мне хранить значение только из одного фильтра за раз. Как я могу убедиться, что я передаю каждое из выбранных в данный момент значений фильтра?

Если бы кто-то мог предоставить хотя бы базовый пример того, как сформулировать такую ​​логику, это было бы очень полезно.


person Muirik    schedule 16.05.2017    source источник
comment
Это странно. Я видел то же имя метода и требование в одном из моих ответов на вопрос. Это задание колледжа? И я увидел твой комментарий. Что вы хотите дальше? stackoverflow.com/questions/43769276/   -  person wannadream    schedule 17.05.2017
comment
Нет, это не задание колледжа. Просто то, над чем я работаю. Я не смог заставить его работать с вашим предыдущим ответом. Я еще раз пересмотрю то, что вы написали, и дам вам знать, в чем был пробел.   -  person Muirik    schedule 17.05.2017
comment
Я вспомнил. Я просто попытался подключить его так, как предложил ваш ответ. Проблема в том, что я все еще могу обрабатывать только один фильтр за раз таким образом. Я применяю только самый последний фильтр. Не все примененные фильтры. Когда я смотрю на полезную нагрузку на вкладке сети, это только самое последнее отправляемое значение фильтра. В этом смысле это не продвинет меня дальше, чем то, что у меня есть выше. Есть идеи, как решить эту проблему, чтобы я мог пройти ВСЕ выбранные в настоящее время фильтры?   -  person Muirik    schedule 17.05.2017
comment
Похоже, ваш метод привязки предназначен только для установки нового фильтра, а не для его публикации на сервере, верно? Затем вам нужно изменить код, чтобы поддерживать его. Когда вы отправите фильтры на сервер? Вы не можете сделать это в «onFilterReceived», так как запуск любого из них вызовет публикацию данных,   -  person wannadream    schedule 17.05.2017
comment
Я хочу отправлять фильтры на сервер каждый раз, когда происходит изменение (независимо от того, выбран ли новый параметр фильтра или параметр фильтра не выбран). Вызов API должен выполняться при каждом изменении, чтобы фильтры можно было складывать и разбирать на основе щелчков пользователем флажков фильтров. Можете ли вы дать мне представление о том, как справиться с этим?   -  person Muirik    schedule 17.05.2017
comment
Кроме того, приведенный выше код запускает вызов API при каждом выборе. Это работает. И он может обрабатывать несколько вариантов, выбранных и отмененных в ОДНОМ фильтре — например, если в качестве языка выбраны английский и испанский — это работает, потому что эта настройка Mongoose принимает массив. Но в настоящее время он не может обрабатывать несколько фильтров. Он обрабатывает только один фильтр за раз из-за характера функции if/else. Поэтому мне нужно переосмыслить этот аспект. Открыт для предложений. :)   -  person Muirik    schedule 17.05.2017
comment
Смотрите мой код и давайте обсудим.   -  person wannadream    schedule 17.05.2017


Ответы (1)


person    schedule
comment
Глядя на этот код, я все еще думаю, что проблема в том, что операторы if позволяют мне обрабатывать только один фильтр за раз. Верно? Кроме того, я думаю, что body должно быть this.body в приведенных выше случаях. - person Muirik; 17.05.2017
comment
Кроме того, я упрощаю свой код выше. Но на самом деле у меня работают четыре фильтра, а не два. Так что чистый вариант «или/или» не сработает. - person Muirik; 17.05.2017
comment
body перемещается в класс вашего компонента. Фильтр будет складываться и разбираться, так как это больше не локальная переменная. - person wannadream; 17.05.2017
comment
Хорошо. Позвольте мне попробовать. - person Muirik; 17.05.2017
comment
Хорошо, я вставил код. Вот что происходит: в языковом фильтре, если я отмечаю испанский язык, данные фильтруются для этого, как и ожидалось. Если я затем перейду к zip-фильтру и отфильтрую его, я получу результаты, которые фильтруют для zip, но выбор языкового фильтра будет потерян. Так что все еще получаю тот или иной фильтр, а не оба. - person Muirik; 17.05.2017
comment
Когда я смотрю на вкладку сети, полезная нагрузка также показывает это. Если моим последним выбором был испанский язык на вкладке языка, я вижу: {services.workflow.status: вход, languages.primary: {$in: [испанский]}} languages.primary : {$in: [испанский]} выбор zip-фильтра отсутствует в полезной нагрузке. Еще и то и другое. - person Muirik; 17.05.2017
comment
Вы можете распечатать this.body? - person wannadream; 17.05.2017
comment
Подожди. Я вижу, у тебя сейчас две функции. Позвольте мне провести рефакторинг. - person Muirik; 17.05.2017
comment
Ух ты! Я думаю, это все. Теперь я вижу, как оба фильтра обрабатываются в одном вызове. И фильтрация данных показывает это и в представлении. Большое спасибо, @wannadream! - person Muirik; 17.05.2017