Использование пользовательской кнопки фильтра для фильтрации списка работает при первом нажатии, но последующие нажатия также не работают! SPFX - PullRequest
1 голос
/ 26 февраля 2020

У меня есть 2 списка SP (A и B). Список А имеет кнопки фильтра рядом с каждым элементом списка. Когда пользователь нажимает кнопку, он должен фильтровать список B, показывая только связанные элементы.

В списке A есть столбец идентификатора, которому список B соответствует это столбец (MasterItems) с идентификатором списка А.

Вот код, который я использую:

public _getListItems() {
    sp.web.lists.getByTitle("ListA").items.get().then((items: any[]) => {
      let returnedItems: IListAItem[] = items.map((item) => { return new ListAItem(item); });

      this.setState({ 
        Items: returnedItems,
        ListAItems: returnedItems,

      });
    });
    sp.web.lists.getByTitle("ListB").items.get().then((items: any[]) => { 
      let returnedItems: IListBItem[] = items.map((item) => { return new ListBItem(item); });

      this.setState({ 

        ListBItems: returnedItems, //This brings in the items from ListB so they can be filtered on this.state.ListB when clicked
      });
    }); 
  }
  private _editItem = (ev: React.MouseEvent<HTMLElement>) => {
   this._getListItems(); //This attempts to reset the list when another filter is clicked, but is half working!
    const sid = Number(ev.currentTarget.id);
    const sid2 = 'DIBR'+sid;
    let _item = this.state.ListBItems.filter((item) => { return item.MasterItem == sid2; });

    if (_item && _item.length > 0) {

      sp.web.lists.getByTitle("ListB").items.get().then((items: any[]) => {
        let returnedItems: IListBItem[] = 
            items.filter(i => _item.some(other => other.Id === i.Id)).map(
              (item) => new ListBItem(item)
              );

        this.setState({ 
          ListBItems: returnedItems,
         });
      });
     } 
  }  

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

С уважением,

T

ОБНОВЛЕНИЕ: Я добавил кнопка очистки фильтра, которая заставляет вещи работать, но хотела бы, чтобы пользователь мог нажимать на фильтр, чтобы фильтровать вместо того, чтобы каждый раз очищать его.

1 Ответ

1 голос
/ 28 февраля 2020

Я делаю то же самое в своем списке SharePoint, поэтому в основном я всегда устанавливаю функцию очистки фильтра перед функцией фильтра, например:

function myFilter(){
//my filter code goes here
}

function clearFilter(){
//the clear filter code goes here
}

Допустим, вы запускаете функцию для выбора элемента или нажмите кнопку или измените ввод текста, установите фильтр очистки для запуска перед фильтром.

function funcGroup{
clearFilter();

setTimeout(() => {
    myFilter();  
}, 300);

}

или

function funcGroup{
setTimeout(() => {
clearFilter();
}, 300);

    myFilter();  
}

Я использую этот сценарий со своими списками SharePoint, и он отлично работает ...

...