我有一个快速链接小部件,其中包含用户可以选择的不同类型的链接/菜单。一次只能显示四个不同的菜单选项-不能或多或少。
在代码中,我首先提取所有菜单选项,它们以[1,2,3 ...]的形式出现,该菜单选项对应于存储菜单选项的列表中的行。
用户选择菜单选项的返回方式也与[2,3,8,9]之类的数组相同,其编号对应于从列表中获得哪一行。
示例:
所有菜单/小工具
这将返回一个数组[1,2,3,4,5,6]
如果我选择保存酒店,巴士,飞机和假期,那么我的用户设置将返回[2,4,5,6]。
问题: 它起作用,直到从用户已保存的列表中删除小部件,然后该小部件仅将显示三个菜单/链接。我希望小部件始终显示四个链接,因此如果缺少一个链接,则需要填充数组。因此,如果缺少它,我想显示另一个链接。最好将链接设置为丢失时将其设置为默认链接(始终是列表中的前四个链接),但这不是必需的。我已经为此建立了逻辑,但是它不起作用。
代码:
public async getUserWidgets(): Promise<Widget[]> {
return new Promise<Widget[]>(async(resolve, error) => {
let allWidgets = await this.getAllWidgets(); // Returns an array of all links [1,2,4...]
let userRepository = new UserProfileRepository(this.absoluteWebUrl);
let userSettings = await userRepository.getUserExtensionValues(this.context); //contains the user saved widgets ex [2,3,6,7]
var result:Widget[] = [];
//如果用户没有设置,或者保存的链接少于4个
if (userSettings == null || userSettings.QuickLinksWidgets == null || userSettings.QuickLinksWidgets.length < 4) {
result = allWidgets.filter((w) => {return w.defaultWidget;}).slice(0,4); //default widget but not really needed.
}
else {
var ids = userSettings.QuickLinksWidgets;
for (let i = 0; i < 4; i++) {
let id = '' + ids[i];
let w = allWidgets.filter((e) => { return e.id == id;});
if (w.length == 0) {
continue;
}
result.push(w[0]);
}
};
resolve(result);
}); }
答案 0 :(得分:0)
根据您的描述,听起来好像您未正确更新(getUserWidgets
更改时调用userSettings.QuickLinksWidgets
?首先检查以确保它按您的期望被调用。
如果正确调用了getUserWidgets
,请尝试在其设置中添加默认值,直到共有4个链接。现在,如果默认链接的设置少于4个,则您使用的是默认链接。
例如:
// take up to 4 user links and make sure we don't exceed the length of the array
for (let i = 0; i < 4 && i < userSettings.QuickLinksWidgets.length - 1; i++) {
// get the id of the widget in the user's settings
let widgetId = userSettings.QuickLinksWidgets[i].id
// find the widget with a matching id and add it to our results
result.push(allWidgets.find(w => w.id === widgetId)
}
// if there's not already 4 links, add more to our list
let j = 0
while (result.length < 4) {
// check the first 4 user links to make sure we didn't include this link already
if (!userSettings.QuickLinksWidgets.slice(0, 4).includes(allWidgets[j].id)) {
// add the new widget to the results
result.push(allWidgets[j])
}
j++
}
resolve(result)