连接你的web part到SharePoint去访问SharePoint中的功能和数据,并且为终端用户提供更多的体验。本文继续上篇文章,进行讲解。
运行Gulp Serve
确认你上篇文章中的gulp serve命令还在运行,如果没有运行,请使用命令行切换到hello-world工程目录中,然后运行如命令:
gulp serve
访问Page Context
当 workbench在本地运行的时候,你没有SharePoint页面的上下文,但是你还是可以通过其他的方式测试你的web part。例如:你可以在没有SharePoint环境中先集中开发web part的界面,然后使用mock数据的方式模拟SharePoint数据。
但是当workbench在本地运行的时候,你还是可以访问pageContext的几个关键的属性,例如:
- Web title
- Web absolute URL
- Web server-relative URL
- User login name
this.context.pageContext
切换到Visual Studio code(或者你喜欢的IDE),然后打开src\webparts\helloWorld\HelloWorldWebPart.ts。把render方法中替换成如下的code:
this.domElement.innerHTML = `
<div class='${styles.helloWorld}'>
<div class='${styles.container}'>
<div class='ms-Grid-row ms-bgColor-themeDark ms-fontColor-white ${styles.row}'>
<div class='ms-Grid-col ms-u-lg10 ms-u-xl8 ms-u-xlPush2 ms-u-lgPush1'>
<span class='ms-font-xl ms-fontColor-white'>Welcome to SharePoint!</span>
<p class='ms-font-l ms-fontColor-white'>Customize SharePoint experiences using Web Parts.</p>
<p class='ms-font-l ms-fontColor-white'>${this.properties.description}</p>
<p class='ms-font-l ms-fontColor-white'>Loading from ${this.context.pageContext.web.title}</p>
<a href='https://github.com/SharePoint/sp-dev-docs/wiki' class='ms-Button ${styles.button}'>
<span class='ms-Button-label'>Learn more</span>
</a>
</div>
</div>
</div>
</div>`;
注意 ${}是在Html代码块中输出变量值的时候使用的,一个额外的p用于显示this.context.pageContext.web.title,因为你的web part是在本地的环境中运行的,所以title的值是Local WorkBench。
保存文件,运行gulp serve的命令窗口会自动检测是否有保存操作并且执行如下命令:
- 自动打包合并更改的code
- 刷新你本地的workbench页面(因为web part 代码需要重新加载)
进入SharePoint中的workbench.aspx页面,全路径应该是:https://your-sharepoint-site-url/Shared%20Documents/workbench.aspx.
注意:如果你没有安装SPFx 开发者证书workbench会提示当前不运行加载本地的JavaScript,执行gulp trust-dev-cert命令可以安装开发者证书。
在SharePoint中的workbench中你可以看到如下界面,此时说明page context在web part中已经是可用的。
定义list的模型
export interface ISPLists {
value: ISPList[];
}
export interface ISPList {
Title: string;
Id: string;
}
ISPList用于存储SharePoint中的list信息。
从mock store中加载list信息
import { ISPList } from './HelloWorldWebPart';
export default class MockHttpClient {
private static _items: ISPList[] = [{ Title: 'Mock List', Id: '1' }];
public static get(restUrl: string, options?: any): Promise<ISPList[]> {
return new Promise<ISPList[]>((resolve) => {
resolve(MockHttpClient._items);
});
}
}
code介绍:
- 因为在HelloWorldWebPart.ts文件中定义了很多个exports model,所以在Import的时候需要使用{},在上面的例子中只有ISPList model是需要引入的。
- 在Import的时候,不需要指定文件的扩展名,在本例中是HelloWorldWebPart。
- 设置MockHttpClient是default model。
- 定义了ISPList数组,并用于返回。
import MockHttpClient from './MockHttpClient';
在HelloWorldWebPart中添加如下私有方法,这个方法是用于MockList数据使用的
private _getMockListData(): Promise<ISPLists> {
return MockHttpClient.get(this.context.pageContext.web.absoluteUrl)
.then((data: ISPList[]) => {
var listData: ISPLists = { value: data };
return listData;
}) as Promise<ISPLists>;
}
从SharePoint站点中加载list信息
private _getListData(): Promise<ISPLists> {
return this.context.httpClient.get(this.context.pageContext.web.absoluteUrl + `/_api/web/lists?$filter=Hidden eq false`)
.then((response: Response) => {
return response.json();
});
}
上面的code使用了一个在SharePoint client-side 平台中的工具类httpClient去执行的SharePoint REST API,它使用了ISPLists model并且读取SharePoint站点中的非hidden list.。保存文件。
添加新的样式
.list {
color: #333333;
font-family: 'Segoe UI Regular WestEuropean', 'Segoe UI', Tahoma, Arial, sans-serif;
font-size: 14px;
font-weight: normal;
box-sizing: border-box;
margin: 10;
padding: 10;
line-height: 50px;
list-style-type: none;
box-shadow: 0 4px 4px 0 rgba(0, 0, 0, 0.2), 0 25px 50px 0 rgba(0, 0, 0, 0.1);
}
.listItem {
color: #333333;
vertical-align: center;
font-family: 'Segoe UI Regular WestEuropean', 'Segoe UI', Tahoma, Arial, sans-serif;
font-size: 14px;
font-weight: normal;
box-sizing: border-box;
margin: 0;
padding: 0;
box-shadow: none;
*zoom: 1;
padding: 9px 28px 3px;
position: relative;
}
保存文件。
<div class="${styles.container}">
render list信息的方法
import { EnvironmentType } from '@microsoft/sp-client-base';
添加如下的私有方法去调用各自的方法去获取list数据:
private _renderListAsync(): void {
// Local environment
if (this.context.environment.type === EnvironmentType.Local) {
this._getMockListData().then((response) => {
this._renderList(response.value);
}); }
else {
this._getListData()
.then((response) => {
this._renderList(response.value);
});
}
}
以上code的描述
- this.context.environment.type属性可以帮助你判断是本地环境还是SharePoint环境
- 你workbench寄宿在哪个环境会决定你调用哪个方法
private _renderList(items: ISPList[]): void {
let html: string = '';
items.forEach((item: ISPList) => {
html += `
<ul class="${styles.list}">
<li class="${styles.listItem}">
<span class="ms-font-l">${item.Title}</span>
</li>
</ul>`;
});
const listContainer: Element = this.domElement.querySelector('#spListContainer');
listContainer.innerHTML = html;
}
上面的方法中引用了新之前新添加的CSS样式,保存文件。
Retrieve list数据
this.domElement.innerHTML = `
<div class="${styles.helloWorld}">
<div class="${styles.container}">
<div class="ms-Grid-row ms-bgColor-themeDark ms-fontColor-white ${styles.row}">
<div class="ms-Grid-col ms-u-lg10 ms-u-xl8 ms-u-xlPush2 ms-u-lgPush1">
<span class="ms-font-xl ms-fontColor-white">Welcome to SharePoint!</span>
<p class="ms-font-l ms-fontColor-white">Customize SharePoint experiences using Web Parts.</p>
<p class="ms-font-l ms-fontColor-white">${this.properties.description}</p>
<p class="ms-font-l ms-fontColor-white">${this.properties.test2}</p>
<p class='ms-font-l ms-fontColor-white'>Loading from ${this.context.pageContext.web.title}</p>
<a href="https://github.com/SharePoint/sp-dev-docs/wiki" class="ms-Button ${styles.button}">
<span class="ms-Button-label">Learn more</span>
</a>
</div>
</div>
<div id="spListContainer" />
</div>
</div>`;
this._renderListAsync();
切换到你本地的workbench然后添加HelloWorld web part,你将会看到如下的效果

