实现一个基于 SharePoint 2013 的 Timecard 应用(中)
门户视图
随着 Timecard 列表的增多,如何查找和管理这许多的 Timecard 也就成了问题。尤其对于团队经理而言,他除了自己填写的 Timecard,还要审核团队成员的 Timecard 任务更重。
这里我把实际的需求简化成为 2 个主要的视图(但能够提供的效果和实际需求其实是非常接近的):
- Time Window 视图
这个视图列出当前用户在所有可以填写的时间窗口中是否提交了 Timecard,起到提醒的作用。
- Timecard 视图
这个视图列出在 Timecard 网站中,所有当前用户参与(包括提交和审批 Timecard)的项目/组织中的 Timecard 的审批状态。方便了解自己的 Timecard 填报进展、方便团队经理查找还没有审批的 Timecard。
技术方案
2个门户视图有很多种技术方案来实现。
- Content Query Web Part 或者 Content Search Web Part。实现第二个视图还勉强可以,注意,只是勉强。实现第一个视图需要 Group Count 功能,直接歇菜。Pass。
- 可视化 Web Part。C# 开发,服务器(场)部署。可以利用服务器端的缓存技术来提高性能。不过,调试是个噩梦,不信你可以搬着指头数数你重启一次 Web Front 需要多少秒。
- Sandbox Web Part。C# 开发,网站部署。具有上面服务器场方案的优点外也避免了它的缺点。不过 SharePoint 2013 叫大家不要用。
- SharePoint Hosted App。JavaScript 开发,服务器(场)发布、网站部署。需要额外配置一个专用的 app 域名和证书。其实这个方案不错,扩展性也很好。但是相比下面的方案,实现显得复杂了点儿。(另外,如果有时间折腾,其实 Provider Hosted App 也可以考虑,这个甚至允许你用 PHP 来写。是那些不喜欢(不愿意喜欢)SharePoint 而又不得不用 SharePoint 的人的不二之选)。顺带提一句,所有 App 方案都有一个巨大初始的优势:调试。直接用 VS 调 JavaScript,那是相当喜闻乐见的。为什么说是“初始”的优势呢?因为一旦基本的 SharePoint 操作你都调得差不多了(熟练掌握)的时候,这个优势就慢慢消失了,那个时候,你的 JavaScript 代码其实已经不容易出现无法在 failure 函数里面捕获的错误了。
- Embedded JavaScript,在网页上面嵌 JavaScript 代码。实现起来最简单,最好维护,对服务器端压力也最小,不刷屏,保护视力。就以上门户视图的需求来看,我选择这个方案。而且,这个方案的代码,搬到 SharePoint Hosted App 也不浪费的。
技术实现
JavaScript (SharePoint CSOM)开发,最烦的是其异步回调的机制。所有向服务器发送的操作,都要在回调函数里面收结果,然后你才能继续下一步的业务逻辑。
目前我找到的比较容易减轻这个症状的方案,是用 Deferred。先将调用服务器的操作用 Deferred 包装,然后用 $.when 来调用并捕获其返回结果。这样,至少形式上看上去,后续的业务逻辑操作是紧跟在前面一步的服务器调用后面的,看上去就舒服多了。
也有很多 JavaScript 的函数库提供了这个问题的解决方案,但在试用之后,我都放弃了。简单的问题还是用简单的方案吧。
为了说明这个实现方法,我们先看一个空的 Deferred 包装的 SharePoint 调用:
1: return $.Deferred(function (dtd) {
2: var web = context.get_web();
3: sp.context.load(web);
4: var failure_callback = Function.createCallback(onSharePointFailed, dtd);
5: sp.context.executeQueryAsync(
6: function () {
7: var title = web.get_title();
8: dtd.resolve();
9: },
10: Function.createDelegate(this, failure_callback));
11: }).promise();
上面的例子中,context 是在调用前初始化好了的 SharePoint Context 全局变量,而 onSharePointFailed 则是预先定义的出错回调函数。
通过上面这样的形式,就完成了一个最简单的 Deferred 封装。
为了使用上面的封装,我们先要将其放入一个函数中去:
1: var spGetWeb = function () {
2: var web = context.get_web();
3: context.load(web);
4: var failure_callback = Function.createCallback(sp.Failed, dtd);
5: sp.context.executeQueryAsync(
6: function () {
7: var title = web.get_title();
8: dtd.resolve();
9: },
10: Function.createDelegate(this, failure_callback));
11: }).promise();
12: }
好了,下面就可以开始调用了(这只是个例子,真的要调用,还是要做很多准备的,比如初始化 context 等等):
1: $.when(spGetWeb())
2: .done(function(){
3: message.succeed("Web is ready.");
4: $.when(spGetList("Time Window"))
5: .done(function(){...})
6: .fail(function(){...});
7: })
8: .fail(function(){
9: message.error("Can't get the web.");
10: }}
上面的例子中,先调用了 spGetWeb,在成功以后(done),接着又调用了 spGetList。这样,原先像面条一样散落的回调业务逻辑,可以用比较人性化的方式呈现了,我们也好少死几个脑细胞。
下面的视频是实现的效果:

实现一个基于 SharePoint 2013 的 Timecard 应用(中)的更多相关文章
- 实现一个基于 SharePoint 2013 的 Timecard 应用(上)
在 SharePoint 2013 上面实现一个 Timecard 应用的想法来自一个真实的需求,而实现的方案在我脑海里面盘旋已经很久了,终于这几天准备安排点儿时间将它实现出来. “ We start ...
- 实现一个基于 SharePoint 2013 的 Timecard 应用(下)
现在,基于 Timecard 数据来一点儿数据分析. 应用需求 对于 Timecard,分析下面 2 个方面: 对于单个项目,分析其中每个成员的工时占比,以此了解工作量分配,为组间人员调度提供参考. ...
- SharePoint 2013 文档库中PPT转换PDF
通过使用 PowerPoint Automation Services,可以从 PowerPoint 二进制文件格式 (.ppt) 和 PowerPoint Open XML 文件格式 (.pptx) ...
- 关于在SharePoint 2013(2010)中Javascript如何实现批量批准的自定义操作功能?
1.概述: SharePoint 2013(包括SharePoint 2010)提供了很方便的,多选的界面,但是很多操作还是不能批量进行,比如:批准的功能.如果您要解决方案不关心代码,那么请直接联系作 ...
- 基于SharePoint 2013的论坛解决方案[开源]
前言 这是自己在空闲时间里,为了提高对SharePoint的认识和熟悉技术,做的一个Demo.可能不尽完善,但是基本功能都已经有了,欢迎大家评论和提意见.自己也会在把源代码放到Github上进行开源, ...
- Sharepoint 2013 - 直接显示Doclib中的html page
缺省的HTML不能直接显示,会被要求存盘.以下操作可以修改 Go to Central Administration Select Manage web applications Select the ...
- SharePoint 2013 入门教程
以下文章是自己在学习SharePoint的过程中,不断积累和总结的博文,现在总结一个目录,分享给大家.这个博客也是自己从SharePoint入门,到一个SharePoint开发的成长记录,里面记录的都 ...
- SharePoint 2013 开发——工作流架构
博客地址:http://blog.csdn.net/FoxDave SharePoint 2013的工作流较之前有了不同,第一次真正地作为独立的服务的概念推出了.这意味着SharePoint工作流不再 ...
- SharePoint 2013 Nintex Workflow 工作流帮助(一)
博客地址 http://blog.csdn.net/foxdave 接下来一段时间的内容中,我们基于SharePoint 2013来了解一下Nintex Workflow的具体内容. 之前的几篇由于之 ...
随机推荐
- Ubuntu 16.04 安装 arm-linux-gcc 嵌入式交叉编译环境 问题汇总
闲扯: 实习了将近半年一直在做硬件以及底层的驱动,最近要找工作了发现了对linux普遍要求很高,而且工作岗位也非常多,所以最近一些时间在时不时地接触linux. 正文:(我一时兴起开始写博客,准备不充 ...
- 08讲browse命令的使用技巧
.浏览所有parts ,使用技巧 .浏览所有 nets,使用技巧 在上图中选择nets .浏览所有 offpage connector,使用技巧 如上 .浏览所有 DRC makers,使用技巧 5. ...
- 在Linux(Ubuntu/openSUSE/CentOS)下配置ASP.NET(Apache + Mono)
[题外话] 闲的无聊竟然想尝试测试自己做的项目在不同操作系统上的性能表现,所以决定试试在Linux上部署Apache和Mono的环境.由于平时很少接触Linux,所以从网上找了几篇文章(附在相关链接中 ...
- Hello Jexus
一.关于 CentOS CentOS(Community Enterprise Operating System)是Linux发行版之一,它是来自于Red Hat Enterprise Linux依照 ...
- 一键部署mono 免费空间支持ASP.NET MVC 再也不担心伙食费换空间了
一直以来 部署mono 都是很头疼的事情 因为是我在是不熟悉非win环境,今天偶然发现这个项目,挺好的,分享下 https://github.com/wshearn/openshift-communi ...
- xamarin绑定原生库的一些坑
最近一个项目涉及到较多的第三方库的绑定技术,中间遇到了几个坑,记录下来与大家分享 绑定Jar库 monoandroid对原生库的调用都通过Android.Runtime.JNIEnv进行调入(http ...
- 分享一个CQRS/ES架构中基于写文件的EventStore的设计思路
最近打算用C#实现一个基于文件的EventStore. 什么是EventStore 关于什么是EventStore,如果还不清楚的朋友可以去了解下CQRS/Event Sourcing这种架构,我博客 ...
- 使用tornado,我们可以做什么?
以下介绍都是建立在python2.x的基础上面,tornado使用任意版本皆可. 如果我们需要对外提供一个http server(web api)/websocket server时,我们都可以使用t ...
- ABP框架 - 依赖注入
文档目录 本节内容: 什么是依赖注入 传统方式的问题 解决方案 构造器注入模式 属性注入模式 依赖注入框架 ABP 依赖注入基础 注册依赖 约定注入 辅助接口 自定义/直接 注册 使用IocManag ...
- css3盒模型
css2.1盒模型: 当你定义盒子的宽高后:如果添加padding和border值后盒子的宽高会被撑大 盒子的高度=定义的高度+(padding-top + padding-bottom)+(bord ...