使用自定义过滤器按钮来过滤列表,在第一次点击时有效,但随后的点击也不起作用! SPFX

Using a custom filter button to filter a list, works on first click but subsequent clicks don't work as well! SPFX

我有 2 个 SP 列表(A 和 B)。 列表 A 在每个列表项旁边都有过滤器按钮。当用户单击按钮时,它应该过滤列表 B,只显示相关项目。

列表 A 有一个 ID 列,列表 B 匹配它的 列 (MasterItems) 与列表 A 的 ID。

这是我使用的代码:

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

更新:我添加了一个清除过滤器按钮,它可以让事情正常进行,但希望用户能够点击过滤器进行过滤,而不是每次都必须清除它。

我正在我的 SharePoint 列表中做同样的事情 所以基本上我总是在过滤功能之前设置清除过滤功能, 例如:

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

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

假设您正在 运行 对项目 select 或按钮单击或文本输入更改进行功能设置,请在过滤器之前将清除过滤器设置为 运行。

function funcGroup{
clearFilter();

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

}

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

    myFilter();  
}

我正在将此方案与我的 SharePoint 列表一起使用,它的工作非常完美...