SharePoint App开发随笔------之JSOM(JavaScript Object Model)

1.使用Visual studio 2015,new project->App for SharePoint

本次使用SharePoint-hosted类型的host,至于Provider-hosted和SharePoint-hosted的区别,可以点“Learn more about this choice”看详细介绍,这里不做详细解释;

2.创建好后的文件结构如下:

各个folder的作用“见名知意”,不浪费时间解释;

3.本次通过在APP中添加一个WebPart来学习JSOM(JavaScript Object Model),选中工程,右键Add New Item,在Office/SharePoint中选择Client Web Part(Host Web),之后工程下面会出现一个和webpart同名的folder,如上图的myselfWP1,同时Pages下也会多出一个和webpart同名的aspx文件myselfWP1.aspx,实际webpart相当于嵌套在主页中的一个子页,按正常的aspx页进行开发即可,这里不多做介绍;

4.在Scripts下添加一个新的JavaScript文件ForMyselfWP1.js,并在myselfWP1.aspx中引用sp.js,sp.runtime.js这两个文件,这相当开发SharePoint程序时引用SharePont的类库,同时引用新添加的JS文件ForMyselfWP1.js,如下图

 ForMyselfWP1.js的功能是在Page加载的时候,访问SharePoint host web和app web上的数据,并把数据显示在WebPart中

 1 var context;
 2 var site;
 3 var web;
 4 
 5 $(document).ready(function () {
 6     QuerySPData();
 7 });
 8 
 9 function QuerySPData() {
10     var urlParams = getQueryStringParameter();
11     var hostWebUrl = urlParams.SPHostUrl || _spPageContextInfo.webAbsoluteUrl;
12     var appWebUrl = urlParams.SPAppWebUrl;
13     context = new SP.ClientContext(appWebUrl);
14     var appContext = new SP.AppContextSite(context, hostWebUrl);
15     site = appContext.get_site();
16     web = context.get_web();
17     context.load(site);
18     context.load(web);
19     context.executeQueryAsync(ShowContent, FailFunc);
20 };
21 
22 function ShowContent(sender, args) {
23     $(document.body).html("<div>" + "host web url:" + site.get_url() + " , app web url:" + web.get_url() + "</div>");
24 }
25 
26 function FailFunc(sender, args) {
27     alert(args.get_message());
28 }
29 
30 function getQueryStringParameter() {
31     var params = document.URL.split('?')[1].split('&');
32     var result = {};
33     for (var i = 0; i < params.length; i = i + 1) {
34         var pair = params[i].split('=');
35         result[pair[0]] = decodeURIComponent(pair[1] || '');
36     }
37     return JSON.parse(JSON.stringify(result));
38 }
View Code

以上的JS并不复杂,有一定JS功底的都可以看懂,但是13-19行的部分看起来可能会比较陌生,这部分正是标题所提到的JSOM,如果是接触过SharePoint online CSOM的同学,对这一部分的调用方式应该很熟悉,先构造ClientContext,之后一步步的点出来你需要的对象,之后使用load方法加载你需要的对象和对象上的特定属性,最后调用executeQuery方法真正的执行,方法名可能略有不同,但是大体的功能是相同的。

眼尖的可能已经看到了,new SP.ClientContext的时候传入的是appWebUrl,而new SP.AppContextSite传入的是hostWebUrl,这和SharePoint online CSOM调用的方式不太一样, 从App web的url大概能推测出原因,App web url的格式是https://TenantName-apphash.sharepoint.com/sites/SCName/AppName

,App web和host web是处于不同的domain中,所以在App中方法host web中的属于相当于cross domain,cross domain相关的知识可参考Access SharePoint data from add-ins using the cross-domain library中的介绍,如果你的app需要访问同一个site collection下的不同web,就需要以上code中构造context site的方式,如果App只需要访问App web,就不需要new SP.AppContextSite,仅仅使用new SP.ClientContent即可。

5.JS写完了,右键工程deploy,对于没有使用VS部署过App Office 365 site collection,此时会报错,提示“Sideloading of apps is not enabled on this site”,这是由于site collection级别的一个叫做Feature:Enable sideloading of Apps for Office and SharePoint没有开,对应的Feature ID是AE3A1339-61F5-4f8f-81A7-ABD2DA956A7D,使用tool或者写个powershell脚本给激活即可,重新Deploy,部署成功后,会创建出来一个和App name相同的App web。

6.在站点home页中添加App中的web part,但是界面上竟然报错了“access deniedXXXXXXX”,这是怎么回事,看error信息像是权限不够,但是App的权限怎么加呢?回头看下第二步中的截图,会发现一个叫做AppManifest.xml文件,双击文件,如下图

每种权限的具体权限可以点击图中的链接“Learn more about app authentication policy”,根据JS中进行的具体操作来决定给予App什么权限,添加好需要的权限,之后重新Deploy,前台页面会提示App需要的权限,其中包括刚新添加的权限

如果客户对App权限有很高要求,在设置权限时,需要确定好需要的最小权限。

 

结语:以上只是对于JSOM的基本使用的介绍,更深入的调用方式在这不做介绍,日后遇到有需要特别注意地方再行记录。

posted @ 2017-06-13 11:05  Arthur还在路上  阅读(377)  评论(0编辑  收藏  举报