0

我遇到了 SharePoint PeoplePicker 控件的问题。当模态对话框打开并处于编辑模式时,可以使用内置函数 SP.UI.ModalDialog.RefreshPage(SP.UI.DialogResult.OK) 刷新页面而不会丢失数据更改。文本、注释、选择、日期等字段可以正常工作,并且在 SP.UI.ModalDialog.RefreshPage(SP.UI.DialogResult.OK) 时不会丢失它们的更改。但遗憾的是,PeoplePicker 字段丢失了数据!

重现步骤

  1. 使用用户字段创建简单项目
  2. 使项目在对话框中打开(列表设置 - 高级 - 在对话框中启动表单)
  3. 创建项目
  4. 打开项目的EditForm
  5. 更新人员选择器字段
  6. 在控制台中执行 SP.UI.ModalDialog.RefreshPage(SP.UI.DialogResult.OK)
4

1 回答 1

0

通过在 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");
于 2016-05-10T18:46:55.477 回答