SharePoint 2013 应用开发实战
上QQ阅读APP看书,第一时间看更新

3.2 JaveScript客户端对象模型

作为客户端对象模型的一种,JaveScript客户端对象模型和.NET客户端对象模型在使用步骤上很类似:

● 初始化ClientContext对象

● 通过ClientContext对象获取到Site/Web对象

● 调用ClientContext.Load方法,定义要获取的信息

● 调用clientContext.executeQueryAsync方法把请求提交到SharePoint

要使用JaveScript客户端对象模型,需要程序开发人员懂的一些基础的JavaScript(JQuery)语法。

3.2.1 环境准备

JaveScript客户端对象模型可以被使用在SharePoint页面或者SharePoint Add-in上。本节将以一个内容编辑器Web部件来存放代码,演示JaveScript客户端对象模型的使用。

在开始之前,先把JQuery上传到网站自带的样式库里,以备后面使用。JQuery是一款优秀的JavaScript库,使用它能让前台开发更方便,并且能兼容多浏览器。

打开上一节用的站点,打开一个页面或者新建一个页面,然后编辑页面,在功能区里,单击插入→Web部件,在“媒体和内容”分类里,选择“内容编辑器”,然后单击“添加”按钮,如图3-14所示:

图3-14 添加内容编辑器Web部件

添加到页面之后,编辑Web部件,如图3-15所示:

图3-15 编辑web部件

在右边的编辑窗口里,找到内容链接的输入框。本节用到JavaScript代码,都会被保存在.js文件里,并上传到顶层站点的样式库里,然后在这里引用,如图3-16所示:

图3-16 引用JaveScript代码

3.2.2 ClientContext

在JaveScript客户端对象模型中,ClientContext是一切对象的入口,因此首先要初始化这个对象。ClientContext的初始化方法如下:

    ClientContext context = new ClientContext("http://mysiteurl");

如果要获取当前站点,则使用:

    ClientContext.get_current();

和.NET客户端不同的是,JaveScript客户端模型的代码运行在SharePoint上下文环境里,因此并不需要提供用户名密码。

JaveScript客户端对象模型和服务器端对象模型的结构是一样的,但是在命名上去掉了SP,表3-2是对照表:

表3-2 JaveScript客户端对象模型和服务器端对象模型的比较

3.2.3 Site和Web对象

1.获取Site对象

获取Site对象的方法如下:

    clientContext.get_Site();

同样,这个时候并没有真正地把Site对象获取过来,需要先执行ClientContext.Load()方法把操作预加载一下,然后执行clientContext.executeQueryAsync方法。

为了不阻塞页面的加载,SharePoint在JavaScript对象模型里提供了clientContext.executeQueryAsync方法,这个方法会把请求发给SharePoint,并且异步获取结果。在接收返回结果的时候,开发人员可以定义两个方法,一个处理结果成功返回的情况,一个处理失败的情况。

下面的代码演示如何获取站点的URL:

    <script type='text/javascript'>
    var clientContext;
    var siteCollection;
    SP.SOD.executeFunc('sp.js', 'SP.ClientContext', LoadSite);
    function LoadSite() {
        clientContext = SP.ClientContext.get_current();
        siteCollection = clientContext.get_site();
        clientContext.load(siteCollection);
        clientContext.executeQueryAsync(onRequestSucceeded, onRequestFailed);
    }
    function onRequestSucceeded() {
       alert('Site Collection URL: ' + siteCollection.get_url());
    }
    function onRequestFailed(sender, args) {
       alert('Error: ' + args.get_message());
    }
    </script>

SP.SOD.executeFunc('sp.js', 'SP.ClientContext', LoadSite); 这句话的意思是,等sp.js加载完毕,再执行LoadSite方法,从而避免出错。

在上面的例子里,如果请求成功返回,就把网站的URL显示出来;如果请求失败,就把失败的消息显示出来。

把上面的代码保存成siteDemo.js,上传到样式库里,注意一下,样式库默认开启了版本控制,因此每次上传都要记住发布一个主要版本。在内容编辑器Web部件的编辑窗口里引用siteDemo.js,最后单击应用,结果如图3-17所示。

图3-17 获取网站集URL

2.获取Web对象

获取Web对象,有两种方法:

● 通过Site对象的OpenWeb(“myWebRelativeURL”)方法,如果参数为空,那么返回顶层站点的对象。

● 通过ClientContext的get_web()方法,获取当前上下文环境的站点。

下面的代码演示如何获取Web对象的标题和说明:

    <script type='text/javascript'>
    var clientContext;
    var website;
    SP.SOD.executeFunc('sp.js', 'SP.ClientContext', LoadWeb);
    function LoadWeb() {
       clientContext = SP.ClientContext.get_current();
       website = clientContext.get_web();
       clientContext.load(website);
       clientContext.executeQueryAsync(onRequestSucceeded, onRequestFailed);
    }
    function onRequestSucceeded() {
       alert('标题: ' + website.get_title()+"\n 说明:"+website.get_description());
    }
    function onRequestFailed(sender, args) {
       alert('Error: ' + args.get_message());
    }
    </script>

把代码保存成webDemo.js,按照上面的方法引用到内容编辑器Web部件里,结果如图3-18所示。

图3-18 获取Web标题和说明

上面的代码获取了完整的Web对象,同样,为了减少数据传输,可以仅获取特定的属性,这就要在ClientContext.Load()方法里指定要获取的属性:

    clientContext.load(website, 'Title', 'Created');

如何更新Web的属性呢?这就要调用Web对象的set_[property]方法了。

    <script type='text/javascript'>
    var clientContext;
    var website;
    SP.SOD.executeFunc('sp.js', 'SP.ClientContext', UpdateWeb);
    function UpdateWeb() {
       clientContext = SP.ClientContext.get_current();
       website = clientContext.get_web();
       website.set_title('Updated Web Site');
       website.set_description('This is an updated Web site.');
       website.update();
       clientContext.load(website, 'Title', 'Description');
       clientContext.executeQueryAsync(onRequestSucceeded, onRequestFailed);
    }
    function onRequestSucceeded() {
       alert('标题: ' + website.get_title()+"\n 说明:"+website.get_description());
    }
    function onRequestFailed(sender, args) {
       alert('Error: ' + args.get_message());
    }
    </script>

3.2.4 List对象

使用Web类的lists属性获取网站中列表的集合,步骤和获取网站对象类似,先调用load(clientObject) 方法加载列表集合,然后调用executeQueryAsync(succeededCallback, failedCallback)。

1.获取列表信息

以下的代码演示如何获取网站所有列表的标题以及说明,并显示在表格里。

首先定义一个id为lists的div,作为容器:

    <div id="lists"></div>

为了使JaveScript编程更简单,在这里引用JQuery。

    <script type='text/javascript' src="/sites/dept/Style%20Library/jquery-
1.11.3.min.js">
    </script>

然后获取列表的信息:

    <script type='text/javascript'>
    SP.SOD.executeFunc('sp.js', 'SP.ClientContext', retrieveAllListProperties);
    function retrieveAllListProperties() {
       var clientContext = new SP.ClientContext();
       var oWebsite = clientContext.get_web();
       this.collList = oWebsite.get_lists();
       clientContext.load(collList);
       clientContext.executeQueryAsync(
          Function.createDelegate(this, this.onQuerySucceeded),
          Function.createDelegate(this, this.onQueryFailed)
       );
    }
    function onQuerySucceeded() {
       var listInfo = '<table><tr><th>标题</th><th>说明</th></tr>';
       var listEnumerator = collList.getEnumerator();
       while (listEnumerator.moveNext()) {
          var oList = listEnumerator.get_current();
          listInfo += '<tr><td>' + oList.get_title() + '<td/><td>' +
             oList.get_description().toString() + '</td></tr>';
       }
       listInfo+="</table>";
     $('#lists').html(listInfo);
    }
    function onQueryFailed(sender, args) {
       $('#lists').html('Request failed. ' + args.get_message() +
          '</br>' + args.get_stackTrace());
    }
    </script>

在上面的代码里,先是定义了一个id为lists的div,然后引用JQuery,再把获取到的列表信息组装成一个表格,显示在div里面,结果如图3-19所示。

图3-19 获取列表信息

如果要减少不必要的数据传输,可以只获取列表的必要属性,修改ClientContext.Load方法为:

    clientContext.load(collList, 'Include(Title, Description)');

2.创建列表

创建列表需要借助于ListCreationInfo类,主要代码如下:

    var listCreationInfo = new SP.ListCreationInformation();
    listCreationInfo.set_title('My Announcements List');
    listCreationInfo.set_templateType(SP.ListTemplateType.announcements);
    this.oList = oWebsite.get_lists().add(listCreationInfo);

然后调用ClientContext的Load和executeQueryAsync方法把请求提交到SharePoint里。

3.更新列表

要更新列表属性,调用list.set_[property]方法:

    oList.set_description('New Announcements List');
    oList.update();

然后调用ClientContext的Load和executeQueryAsync方法把请求提交到SharePoint里。

4.删除列表

删除列表的主要代码如下:

    this.oList = oWebsite.get_lists().getByTitle('My Announcements List');
    oList.deleteObject();

然后调用ClientContext的executeQueryAsync方法把请求提交到SharePoint里。

3.2.5 ListItem对象

若要使用JavaScript客户端对象模型获取列表项,可使用getItemById(id) 函数返回单个项,也可使用getItems(query) 函数返回多个项。然后使用load(clientObject) 函数获取代表这些项的列表项对象。getItems(query) 函数仍然使用CAML查询,以指定要返回哪些项。为了减少数据传输,不建议获取所有的列表项,也不建议获取所有的栏值。应该只查询需要的列表项和栏。

1.获取列表项

下面的代码演示如何获取通知列表项里面,最新添加的5条通知。

    var clientContext = new SP.ClientContext();
    var oList = clientContext.get_web().get_lists().getByTitle('通知');
    var camlQuery = new SP.CamlQuery();
    camlQuery.set_viewXml(
           '<View><Query><OrderBy><FieldRef Name="Created" Ascending="FALSE"
/></OrderBy></Query>' +
           '<RowLimit>5</RowLimit></View>'
    );
    this.collListItem = oList.getItems(camlQuery);

然后调用ClientContext的Load和executeQueryAsync方法把请求提交到SharePoint里。结果如图3-20所示。

图3-20 获取最新5个通知

如果只想获取特定的属性,以减少数据传输,那么需要修改ClientContext.Load方法:

    clientContext.load(
           collListItem,
           'Include(Id, DisplayName, HasUniqueRoleAssignments)'
    );

2.创建列表项

创建列表项需要借助ListItemCreationInformation对象。下面的代码演示如何创建一个列表项,并为栏赋值:

    var oList = clientContext.get_web().get_lists().getByTitle('Announcements');
    var itemCreateInfo = new SP.ListItemCreationInformation();
    this.oListItem = oList.addItem(itemCreateInfo);
    oListItem.set_item('Title', 'My New Item!');
    oListItem.set_item('Body', 'Hello World!');
    oListItem.update();

之后再调用ClientContext的Load和executeQueryAsync方法把请求提交到SharePoint里。

3.更新列表项

更新列表项的主要代码如下:

    this.oListItem = oList.getItemById(3);
    oListItem.set_item('Title', 'My Updated Title');
    oListItem.update();

之后再调用ClientContext的executeQueryAsync方法把请求提交到SharePoint里。

4.删除列表项

删除列表项的主要代码如下:

    oListItem = oList.getItemById(itemId);
    oListItem.deleteObject();

之后再调用ClientContext的executeQueryAsync方法把请求提交到SharePoint里。