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