【SharePoint】SharePoint2013中使用客户端对象模型给用户控件赋初值
2015-07-14 17:00
771 查看
本文要实现的功能:新建一条列表记录,打开新建记录画面时,自动给【申请人】赋值为当前登录用户。
在SharePoint2010中,可以使用SPServices的SPFindPeoplePicker方法来设定用户选择控件的值。
其中SPGetCurrentUser用来取得当前登录的用户名。
但是SPServices的SPFindPeoplePicker方法在SharePoint2013中没有效果。
后来发现了这篇文章SP2013: Setting people picker value in NewForm.aspx
原文里隐藏删除图标的代码有bug,下面是修改后的代码:
本来想用SPGetCurrentUser方法默认的Name属性值,但在SharePoint2013中会变成 【i:0#.w|domain\username】的样子,直接使用的话无法检索到用户。
这里直接使用了UserName属性值,另外还可以使用Name属性值中竖线后面部分的值。
单独执行上面的代码可以成功实现赋值的效果,但是在画面加载后执行时出现如下错误。
Uncaught ReferenceError: SPClientPeoplePicker is not defined
或者
Uncaught TypeError: Cannot read property ‘get_current’ of undefined
debug发现是代码加载顺序导致的。 虽然JS代码使用了_spBodyOnLoadFunctionNames.push(“funcName”)方法在页面加载完成后执行上面的JS代码,但是由于使用了RegisterSod延迟加载,导致即使页面加载完了,相关的JS文件还没有执行。
参照SharePoint JS延迟加载类(SP.SOD)介绍。使用executeOrDelayUntilScriptLoaded方法,待sp.js文件加载后,再执行初期处理。
在SharePoint2010中,可以使用SPServices的SPFindPeoplePicker方法来设定用户选择控件的值。
其中SPGetCurrentUser用来取得当前登录的用户名。
$().SPServices.SPFindPeoplePicker({ peoplePickerDisplayName: "申请人", valueToSet: $().SPServices.SPGetCurrentUser(), checkNames: true });
但是SPServices的SPFindPeoplePicker方法在SharePoint2013中没有效果。
后来发现了这篇文章SP2013: Setting people picker value in NewForm.aspx
原文里隐藏删除图标的代码有bug,下面是修改后的代码:
function SetAndDisablePeoplePicker(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 peoplePickerDiv.find('.sp-peoplepicker-delImage').css('display','none'); } SetAndDisablePeoplePicker("申请人", $().SPServices.SPGetCurrentUser({fieldName:"UserName"}));
本来想用SPGetCurrentUser方法默认的Name属性值,但在SharePoint2013中会变成 【i:0#.w|domain\username】的样子,直接使用的话无法检索到用户。
这里直接使用了UserName属性值,另外还可以使用Name属性值中竖线后面部分的值。
单独执行上面的代码可以成功实现赋值的效果,但是在画面加载后执行时出现如下错误。
Uncaught ReferenceError: SPClientPeoplePicker is not defined
或者
Uncaught TypeError: Cannot read property ‘get_current’ of undefined
debug发现是代码加载顺序导致的。 虽然JS代码使用了_spBodyOnLoadFunctionNames.push(“funcName”)方法在页面加载完成后执行上面的JS代码,但是由于使用了RegisterSod延迟加载,导致即使页面加载完了,相关的JS文件还没有执行。
<script type="text/javascript">RegisterSod("clientpeoplepicker.js", "\u002f_layouts\u002f15\u002fclientpeoplepicker.debug.js?rev=1g1eASPDnQkf5uTwy7wWMA\u00253D\u00253D");</script> <script type="text/javascript">RegisterSod("sp.js", "\u002f_layouts\u002f15\u002fsp.debug.js?rev=IR\u00252FvhMqBTNIUqECkE3HAZw\u00253D\u00253D");RegisterSodDep("sp.js", "sp.runtime.js");RegisterSodDep("sp.js", "sp.ui.dialog.js");RegisterSodDep("sp.js", "sp.res.resx");</script>
参照SharePoint JS延迟加载类(SP.SOD)介绍。使用executeOrDelayUntilScriptLoaded方法,待sp.js文件加载后,再执行初期处理。
ExecuteOrDelayUntilScriptLoaded(init, "sp.js"); function init() { SetAndDisablePeoplePicker("申请人", $().SPServices.SPGetCurrentUser({fieldName:"UserName"})); }
相关文章推荐
- 每天一个linux命令day2【ss命令】
- maven项目中 “ 错误: 找不到或无法加载主类" 的解决办法
- iOS UITableView Cell动态高度(使用AutoLayout)
- eclipse 开发 spark Streaming wordCount
- hdu2089 数位dp
- Android特效 五种Toast详解
- 二分查找
- C++的Json解析库:jsoncpp
- 仿写android-serialport-api
- AuthenticationException
- Java 实现在线打印
- java静态代码块在加载类时值执行,只执行一次
- iOS开发者帐号申请指南
- ajax + php + Controller 控制所有后台函数调用
- my97 日期控件
- C++ 布线问题,分支限界法
- ASP.Net 的幾種畫面 跳轉
- Android 使用HttpClient和第三方MiME文件上传类库,实现文件上传
- GetLocalTime与GetSystemTime区别
- 快排