2015-12-17 48 views
1

我試圖使用JavaScript來填充在Sharepoint 2013年PeoplePicker控制:如何填充PeoplePicker控件?

name="Engineer" 
var ppDiv=$("[id$='ClientPeoplePicker'][title='"+name+"']"); 
console.log(ppDiv.html()); 
var ppEditor=ppDiv.find("[title='"+name+"']"); 
var spPP=SPClientPeoplePicker.SpClientPeoplePickerDict[ppDiv[0].id]; 
ppEditor.val("Abc, Xyz"); 
spPP.AddUnresolvedUserFromEditor(true); 

兩個問題:ppDiv仍然不確定賦值語句後,並沒有定義SPClientPeoplePicker;根據this article,它由clientpeoplepicker.js定義,該腳本應該在每個具有人員選取器的頁面上加載。

編輯:

我改變了代碼:

name="Engineer" 
var ppDiv=$("div[title='"+name+"']"); 
console.log(ppDiv.html()); 
var ppEditor=ppDiv.find("[title='"+name+"']"); 
var spPPD=SPClientPeoplePicker.SpClientPeoplePickerDict; 
console.log(spPPD[0]); 
var spPP=spPPD[ppDiv[0].id]; 
ppEditor.val("Abc, Xyz"); 
spPP.AddUnresolvedUserFromEditor(true); 

現在ppDiv定義(如通過其HTML控制檯日誌中成功地出現),但它的崩潰就行var spPPD=SPClientPeoplePicker.SpClientPeoplePickerDict;與此錯誤:

Uncaught ReferenceError: SPClientPeoplePicker is not defined 
+0

難道是內串聯$()調用?嘗試包裝 「[id $ ='ClientPeoplePicker'] [title ='」+ name +「']」 括號內?沒有更多的代碼很難說。 –

+0

@AndrueAnderson,你的意思是這是不足以重現問題的代碼? – sigil

+0

我的意思是很難說沒有更多的代碼是什麼問題,但我相信我會得到一個錯誤複製粘貼提供的文本。 –

回答

0

這是我是如何做到的。使用fieldName作爲人員選擇器的列標題和userAccountName用戶登錄名稱/索賠的最後部分。

有一點需要指出的是,它必須是一個客戶人選。據我所知,SharePoint在默認情況下在自定義表單中使用服務器端人員選擇器,因此請確保它是一個真正的客戶端人員選擇器。

function SetAndResolvePeoplePicker(fieldName, userAccountName) { 

var controlName = fieldName; 

var peoplePickerDiv = $("[id$='ClientPeoplePicker'][title='" + controlName + "']"); 

var peoplePickerEditor = peoplePickerDiv.find("[title='" + controlName + "']"); 

var spPeoplePicker = SPClientPeoplePicker.SPClientPeoplePickerDict[peoplePickerDiv[0].id]; 

peoplePickerEditor.val(userAccountName); 

spPeoplePicker.AddUnresolvedUserFromEditor(true); 

//disable the field 

spPeoplePicker.SetEnabledState(false); 

//hide the delete/remove use image from the people picker 

$('.sp-peoplepicker-delImage').css('display','none'); 

} 
0

我發現,如果我調用代碼前加500-700ms的延遲,我沒​​有得到這個錯誤:

window.setTimeout(function() { 
 
     SetAndResolvePeoplePicker("PickerFieldName", "[email protected]"); 
 
     }, 750); 
 

 
    function SetAndResolvePeoplePicker(fieldName, userAccountName) { 
 
     var controlName = fieldName; 
 
     var peoplePickerDiv = jQuery("[id$='ClientPeoplePicker'][title='" + controlName + "']"); 
 
     var peoplePickerEditor = peoplePickerDiv.find("[title='" + controlName + "']"); 
 
     var spPeoplePicker = SPClientPeoplePicker.SPClientPeoplePickerDict[peoplePickerDiv[0].id]; 
 
     peoplePickerEditor.val(userAccountName); 
 
     spPeoplePicker.AddUnresolvedUserFromEditor(true); 
 
    }

+2

使用硬編碼延遲被認爲是不好的做法。最好對事件做出反應。 – jediz

+0

更好地使用[ExecuteOrDelay](https://stackoverflow.com/questions/34341724/how-to-populate-peoplepicker-control#comment56452993_34341724),因爲遲早你的環境(服務器,網絡,瀏覽器,代碼庫等) )會改變,速度會隨之改變。 – jpaugh