SharePoint Framework 把你的客户端web部件连接到SharePoint
把你的web部件连接到SharePoint来访问SharePoint中的功能和数据,为终端用户提供更完整的体验。本篇会基于之前构建的hello world的web部件继续改进。
运行gulp serve
不多数,这步还是首要的,否则没法进行调试的。确保你已经在命令行中运行了gulp serve这个命令。
访问页面上下文
当本地工作台被承载起来的时候,你是无法获得SharePoint页面上下文的,当然你仍然能用许多不同的方式测试你的web部件。比如,你可以专注于构建web部件的UX(用户体验),使用假数据去模拟与SharePoint的交互。
但是当工作台在SharePoint中承载时,你就可以访问页面上下文了,上下文提供了很多关键的属性,如:
>网站标题
>网站绝对URL
>网站相对URL
>用户登录名
你可以在web部件类中使用下面的变量访问页面上下文:
this.context.pageContext
切换到Visual Studio code(或者是你喜欢的IDE),打开文件src\webparts\helloWorld\HelloWorldWebPart.ts。
在render方法中,用下面的代码替换代码块中的innerHTML部分:
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块中输出变量的。一个额外的HTML的P标签用来显示this.context.pageContext.web.title属性。由于这个web部件现在是从本地环境加载的,标题会显示为Local Workbench。
保存文件,运行着的gulp serve会发现保存操作并:
>自动编译和打包更新的代码。
>刷新你的本地工作台页面(因为web部件代码需要重新加载)。
你可以将Visual Studio Code和命令行窗体左右排列放在一起,就能发现上述的机制。
在你的浏览器中,访问本地的workbench.html,链接为:http://localhost:4321/temp/workbench.html,如下图。
下面咱们访问SharePoint的workbench.aspx,完整的URL是这样的格式,具体的domain自行修改:https://your-sharepoint-site-url/Shared%20Documents/workbench.aspx。
我们仍然用Chrome去看一下效果,如下图,可以看到能够读取到网站的标题了。
定义列表模型
你需要一个列表模型去开始跟SharePoint列表数据交互,你需要两个模型来获取列表。
切换到Visual Studio Code,打开文件src\webparts\helloWorld\HelloWorldWebPart.ts。
在HelloWorldWebPart类的上方定义如下的接口模型:
export interface ISPLists {
value: ISPList[];
} export interface ISPList {
Title: string;
Id: string;
}
添加完代码的文件如下图所示,ISPList接口用来掌管我们要连接的SharePoint列表信息。
从模拟存储获取列表
你需要一个假的存储去返回假的数据来测试本地的工作台。
在src\webparts\helloWorld路径创建一个名为MockHttpClient.ts的新文件,在项目结构上的helloWorld节点右键,选择New File。
然后在新建的文件中输入以下代码:
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);
});
}
}
关于上面的代码需要知道以下几点:
>由于在HelloWorldWebPart.ts文件中有很多导出,特定的一个导入使用大括号{}指定了。在这里,只需要导入数据模型ISPList。
>当从默认模块导入时(这里是HelloWorldWebPart),你不需要输入文件的扩展名。
>它将MockHttpClient类导出为默认模块,这可以在其他文件被导入。
>它编译初始的ISPList模拟数组并返回。
保存文件,现在你可以在HelloWorldWebPart类中使用MockHttpClient类了。首先你需要导入MockHttpClient模块。
打开HelloWorldWebPart.ts文件。
在代码import { IHelloWorldWebPartProps } from './IHelloWorldWebPartProps';的下面粘贴下面的代码:
import MockHttpClient from './MockHttpClient';
在HelloWorldWebPart类中添加下面的私有方法来模拟获取列表的操作。
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网站获取列表
接下来你需要从当前SharePoint网站获取列表。你将会使用SharePoint REST API来从网站获取列表数据,该操作的地址为https://yourtenantprefix.sharepoint.com/_api/web/lists。
在HelloWorldWebPart类中添加下面的方法来从SharePoint中获取列表数据:
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();
});
}
该方法使用了一个httpClient帮助类,这个类在SharePoint客户端平台上可用来执行REST API。上面的代码中它使用ISPLists模型并应用了不获取隐藏列表的筛选条件。
保存文件,切换到运行gulp serve的命令行窗口看看是否有错误发生。如果有错误发生的话需要先修复错误再往后继续。
添加新的样式
SharePoint Framework使用Sass作为CSS预处理器,特别使用了SCSS语法,该语法完全符合正常的CSS语法。Sass扩展了CSS语言,允许你使用像变量、嵌套规则和内联导入等功能来为你的web部件组织和创建高效的样式表。SharePoint Framework里面已经提供了SCSS编辑器,它可以将你的Sass文件转换成正常的CSS文件,同时还在开发过程中提供了类型的版本。
要想添加新的样式,打开文件HelloWorld.module.scss,在这个SCSS文件中定义你自己的样式。
默认情况下,样式的范围是你的web部件,你可以看到定义在.helloWorld下的样式。
在.button样式下添加下面的样式:
.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;
}
保存文件,gulp会马上将代码重新编译,这也会在HelloWorld.module.scss.ts文件中同时生成相应的类型。一旦编译为typescript,你就能在你的web部件代码中导入并引用这些样式了。
你可以看到web部件中的render方法。
<div class="${styles.container}">
获取展示列表信息的方法
打开HelloWorldWebPart类文件。SharePoint工作台提供了足够的灵活性,使你可以在本地环境和SharePoint中测试web部件。SharePoint Framework旨在借助这种能力通过使用EnvironmentType模块帮助你了解你的web部件运行在哪个环境。
你首先需要从@microsoft/sp-client-base包中导入EnvironmentType模块,将下面的代码添加到导入部分:
import { EnvironmentType } from '@microsoft/sp-client-base';
将下面的私有方法添加到HelloWorldWebPart类中去调用各自的方法获取列表数据:
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);
});
}
}
关于_renderListAsync方法中承载类型的说明:
>this.context.environment.type属性会帮助你检查当前是处在本地环境还是SharePoint环境。
>调用哪个方法取决于你的工作台在哪承载。
>目前会提示_renderList找不到,不要着急,下面会补全。
保存文件,现在你需要将从REST API获取到的列表数据展示出来。将下面的私有方法添加到HelloWorldWebPart类中:
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;
}
该方法通过styles这个变量引用了之前新添加的CSS样式,保存文件,没有问题的话会弹出一个编译成功的提示。
获取列表数据
定位到render方法,然后用下面的代码替换原来的内容:
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();
保存文件,同样gulp serve会自动进行编译,确保没有发生任何错误。
切换到你的本地工作台,添加HelloWorld的web部件,你会看到返回的模拟数据,如下图:
接下来访问SharePoint承载的工作台,效果如下图:
现在你可以暂时停止gulp serve的运行了,切换到命令行,用Ctrl+C来中断gulp task。
下一步
恭喜你成功地在你的web部件中连接了SharePoint的数据。在下一讲我们将继续深入讲解,如何将web部件部署到一个传统的SharePoint服务端页面。
SharePoint Framework 把你的客户端web部件连接到SharePoint的更多相关文章
- SharePoint Framework 把你的客户端web部件部署到经典的SharePoint页面
博客地址:http://blog.csdn.net/FoxDave 本节介绍如何把客户端web部件部署到SharePoint服务端页面.我们将继续使用之前的工程. 将HelloWorld的web部 ...
- SharePoint Framework 配置你的SharePoint客户端web部件开发环境
博客地址:http://blog.csdn.net/FoxDave 你可以使用Visual Studio或者是你自己的开发环境来构建SharePoint客户端web部件.你可以使用Mac.PC或是 ...
- SharePoint创建一个简单的Visio Web部件图
SharePoint创建一个简单的Visio Web部件图 Visio有很多强大的Mash-up混聚功能,使它能够轻松集成到SharePoint 2010中. 1. 打开Visio 2010,创建新的 ...
- SharePoint Framework 配置Office 365开发者租户
博客地址:http://blog.csdn.net/FoxDave 你需要一个Office 365开发者租户来使用预览版SharePoint Framework构建和发布客户端web部件.你的租户 ...
- SharePoint Framework 企业向导(一)
博客地址:http://blog.csdn.net/FoxDave 简介 SharePoint Framework(SPFx)是一个新的SharePoint用户接口扩展的开发模型,它用来补充现有的 ...
- SharePoint Framework 在web部件中使用第三方样式 - 将第三方样式打到包中
博客地址:http://blog.csdn.net/FoxDave 有许多第三方库可以帮助我们构建丰富的SharePoint Framework客户端web部件.并且这些JavaScript脚本常常包 ...
- SharePoint Framework 在web部件中使用已存在的JavaScript库 - JavaScript库的格式
博客地址:http://blog.csdn.net/FoxDave JavaScript库格式 不同的JavaScript库的编译和打包方式各不相同.一些是以模块的方式打包的,而另一些是以纯脚本运行在 ...
- SharePoint Framework 在web部件中使用已存在的JavaScript库 - 捆绑打包和外部引用
博客地址:http://blog.csdn.net/FoxDave 在构建SPFx客户端web部件时,你可以使用公网已有的JavaScript库来构建强大的解决方案.但是在使用的时候你需要考虑你引用的 ...
- SharePoint Framework 构建你的第一个web部件(二)
博客地址:http://blog.csdn.net/FoxDave 本篇接上一讲,介绍一下web部件项目中的代码. 下面首先列举一下项目中的一些关键文件. Web部件类 HelloWorldWebPa ...
随机推荐
- JS获取系统时间--JavaScript基础
1.网页中实时显示当前时间 <!DOCTYPE html><html lang="en"><head> <meta charset=&qu ...
- 【WPF】Silverlight中的Action与Trigger
最近做的Silverlight项目上用到了大量的拖拽,自动跟随等功能,由于赶时间,加上对Silverlight半生不熟,用的是最简单也是最不好维护的方法.项目忙完了闲下来,想重构一下代码,想起了Tri ...
- linux文件管理之查找
1 文件查找 1.1 which 查找可执行文件的路径which是通过 PATH环境变量到该路径内查找可执行文件,所以基本的功能是寻找可执行文件[root@www ~]# which [-a] com ...
- 11月28日 记录一个错误❌,看ruby on rails --active support core extensions--present? && presence && duplicable?
❌错误 1. @job.resume.count: 提示❌ undefined method `resume' ✅: @job.resumes.count //解释:调出某一个job的所有简历, ...
- 【模板/经典题型】树上第k大
直接对树dfs一发,对每个节点建出主席树. 查询的时候主席树上二分,四个参数x+y-lca(x,y)-fa[lca(x,y)]. 如果要求支持动态加边的话,只需要一个启发式合并即可,每次暴力重构主席树 ...
- python-django rest framework框架
1.API 接口 是什么,干什么用的? API简单的来说就是一个url - http://www.oldboyedu.com/get_user/ - http://www.oldboyedu.com ...
- docker实战系列之搭建rabbitmq
1.搜索镜像[注:因为我这里采用的是阿里云镜像加速器,所以我直接在阿里云中搜索相关镜像路径],点击"详情"查看公网拉取路径 2.拉取镜像 docker pull registry. ...
- MYSQL--服务器的安装
MYSQL--服务器的安装 学java已经好久了,但是还是没有学会安装数据库,这次重装系统后自己学了学,昨天晚上刚刚装好,卸载了,再装一次,就想着把它笔记下来.要不又忘了.. 1.删除你的服务.在cm ...
- 一个典型的多表参与连接的复杂SQL调优(SQL TUNING)引发的思考
今天在看崔华老师所著SQL优化一书时,看到他解决SQL性能问题的一个案例,崔华老师成功定位问题并进行了解决.这里,在崔华老师分析定位的基础上,做进一步分析和推理,以便大家一起研究探讨,下面简述该案例场 ...
- springboot自动装配
Spring Boot自动配置原理 springboot自动装配 springboot配置文件 Spring Boot的出现,得益于“习惯优于配置”的理念,没有繁琐的配置.难以集成的内容(大多数流行第 ...