Возвращать параметры, только если они не пустые - PullRequest
0 голосов
/ 19 июня 2020

У меня есть метод для создания фильтров, как показано ниже:

_generateFilters() {
    const status = get(this, 'controller.status');
    const type = get(this, 'controller.type');
    const name = get(this, 'controller.name');

    const statusFilter = isEmpty(status) ? [] : generateFilter(status);
    const typeFilter = isEmpty(type) ? [] : generateFilter(type);
    const nameFilter = isEmpty(name) ? [] : generateFilter(name);

    return {
       statusFilter,
       typeFilter,
       nameFilter,
    };
}

Сейчас он вернет все параметры, но я хочу вернуть параметры только с непустым значением. например, если статус пуст, тип и имя не пустые, тогда верните {tyepFilter, nameFilter}. Кто-нибудь знает, как это сделать в этом методе? Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Вы можете начать с пустого объекта и просто добавить то, что нужно добавить:

_generateFilters() {
    const status = get(this, 'controller.status');
    const type = get(this, 'controller.type');
    const name = get(this, 'controller.name');

    const res = {};

    !isEmpty(status) && (res.statusFilter = generateFilter(status));
    !isEmpty(type) && (res.typeFilter = generateFilter(type));
    !isEmpty(name) && (res.nameFilter = generateFilter(name));

    return res;
}

Если вы не знакомы с этим способом использования &&:

!isEmpty(status) && (res.statusFilter = generateFilter(status));

Это эквивалентно:

if (!isEmpty(status)) { res.statusFilter = generateFilter(status); }

Работает с && благодаря оценке короткого замыкания : Когда вы связываете условия с &&, как только одно из этих условий ложно, остальное не выполняется. Следовательно, вы не добавите свойство к результату, если !isEmpty() вернет false

0 голосов
/ 19 июня 2020

Я бы подошел к этой проблеме с помощью @computed.collect и @computed.filter:

export default class MyFilterComponent extends Component {
  @computed.collect('controller.{status,name,type}') parameters;
  @computed.filter('parameters', (parameter) => parameter) validParams;

  _generateFilters() {
    return this.validParams;
  }
}

В качестве альтернативы вы можете упростить раскладку скобок и просто использовать @computed.filter и используйте помощник isEmpty для защиты от пустых строк, таких как '' и ' ':

import {computed} from '@ember/object';
import {isEmpty} from '@ember/utils';

export default class MyFilterComponent extends Component {
  @computed.filter('controller.{status,name,type}', (parameter) => isEmpty(parameter)) validParams;

  _generateFilters() {
    return this.validParams;
  }
}
...