使用自定义过滤器按钮来过滤列表,在第一次点击时有效,但随后的点击也不起作用! 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 列表一起使用,它的工作非常完美...
我有 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 列表一起使用,它的工作非常完美...