通过在 RefreshPage() 时将 PeoplePicker 值存储在 sessionStorage 中并在之后重新加载它们来进行修复。
打字稿 1.8
// FIX for SPClientPeoplePicker not preserving state afre SP.UI.ModalDialog.RefreshPage...
export class ClientPeoplePickerFix {
static getPplPickerElementsInForm = (): Array<HTMLInputElement> => {
var result = new Array<HTMLInputElement>();
var elements = document.getElementsByTagName("form")[0].elements;
for (var i = 0; i < elements.length; i++) {
var currentEl = (<HTMLInputElement>elements[i]);
if (currentEl.name.indexOf("$ClientPeoplePicker_HiddenInput") > -1) {
result.push(currentEl);
}
}
return result;
}
static storePeoplePickerValues = (): void => {
var elements = ClientPeoplePickerFix.getPplPickerElementsInForm();
for (var i = 0; i < elements.length; i++) {
var currentEl = elements[i];
var pplPicker = SPClientPeoplePicker.PickerObjectFromSubElement(currentEl);
var currentUserInfo = pplPicker.GetAllUserInfo();
if (currentUserInfo.length > 0) {
sessionStorage.setItem(currentEl.name, JSON.stringify(currentUserInfo));
}
}
}
static restorePeoplePickerValues = (): void => {
var elements = ClientPeoplePickerFix.getPplPickerElementsInForm();
for (var i = 0; i < elements.length; i++) {
var currentEl = elements[i];
var currentUserInfoSerialized = sessionStorage.getItem(currentEl.name);
if (currentUserInfoSerialized) {
var pplPicker = SPClientPeoplePicker.PickerObjectFromSubElement(currentEl);
var currentUserInfo = JSON.parse(currentUserInfoSerialized);
currentUserInfo.forEach((user) => {
pplPicker.AddProcessedUser(user, true);
});
sessionStorage.removeItem(currentEl.name);
}
}
}
static overrideRefreshPage = (): void => {
var _refreshPage = SP.UI.ModalDialog.RefreshPage;
SP.UI.ModalDialog.RefreshPage = function () {
if (arguments && arguments.length > 0 && arguments[0] === SP.UI.DialogResult.OK) {
ClientPeoplePickerFix.storePeoplePickerValues();
}
_refreshPage.apply(this, arguments);
}
}
}
// Override SP.UI.Modal.Dialog.RefreshPage
// Store values from all SPClientPeoplePickers in sessionStorage when SP.UI.Modal.Dialog.RefreshPage is called
SP.SOD.executeOrDelayUntilScriptLoaded(() => {
ClientPeoplePickerFix.overrideRefreshPage();
}, "sp.ui.dialog.js");
// On page load
// Restore SPClientPeoplePicker values from sessionStorage and add in appropriate controls
SP.SOD.executeOrDelayUntilScriptLoaded(() => {
ClientPeoplePickerFix.restorePeoplePickerValues();
}, "sp.core.js");