0

SharePoint PeoplePickerコントロールに問題があります。モーダルダイアログが開かれ、編集モードでは、組み込み関数SP.UI.ModalDialog.RefreshPage(SP.UI.DialogResult.OK)を使用して、データの変更を失うことなくページを更新することができます。 Text、Note、Choice、Dateなどのフィールドは正常に動作し、SP.UI.ModalDialog.RefreshPage(SP.UI.DialogResult.OK)を変更してもその変更は失われません。 しかし、PeoplePickerフィールドは残念ながらデータを失います。 SharePoint ModalダイアログのPeoplePickerフィールドは、SP.UI.ModalDialog.RefreshPageでデータを失います。

手順

  1. は、ユーザーフィールドでシンプルなアイテムを作成再現する
  2. メイクアイテムダイアログで開いて([リストの設定 - 詳細 - ダイアログの起動フォーム)項目
  3. オープンを作成
  4. アイテムの編集フォーム
  5. 人物ピッカーフィールドを更新します。
  6. SP.UI.ModalDialog.RefreshPage(SP.UI.DialogResult.OK)をコンソール

答えて

0

RefreshPage()でSessionStorageにPeoplePickerの値を格納し、後で再読み込みすることで修正しました。

活字体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"); 
関連する問題