使用TypeScript开发一个在线记事本,支持离线存储
先贴上源码传送门: https://github.com/flowforever/yaryin.note
记事本网址: http://yindoc.com , 井号后面写你喜欢的文件名即可。
最近在研究NativeScript,NativeScript使用TypeScript,于是就顺便研究了ts。
不得不提到NativeScript源码学习,感觉学习到了不少东西,顺便也从上面扣了一个依赖注入的框架下来用,实际使用感觉非常给力。
文件地址: https://github.com/flowforever/yaryin.note/blob/master/utils/yok.ts
除了稍微修改一下依赖,其他基本没动。
ts 给我的第一印象就是清爽分明,配合WebStorm逆天的自动编译,写的过程中代码哪边编译不通过提示非常详细。
先贴两段代码:
serviceBase.ts
/**
* Created by trump on 15/4/23.
*/
///<reference path="../_references.d.ts"/>
/// <reference path="./_references.d.ts"/>
import db = require('../db/db');
import Future = require("fibers/future");
import Fiber = require('fibers'); export class ServiceBase { constructor(table) {
this.table = table; // 这个table就是mongoose的Model
this.$table = Future.wrap(table); //配合node fibber 解决异步callback hell 太给力了
} table;
$table; getAll() : IFuture<any> {
return this.$table.findFuture.bind(this.table)({});
} add(model): IFuture<any> {
return this.$table.createFuture.bind(this.table)(model);
} findById(id: string): IFuture<any> {
return this.$table.findOneFuture.bind(this.table)({
_id: id
});
} find(query:any): IFuture<any>{
return this.$table.findFuture.bind(this.table)(query);
} findOne(query:any): IFuture<any>{
return this.$table.findOneFuture.bind(this.table)(query);
}
}
documentServices.ts
/// <reference path="./_references.d.ts"/>
import db = require('../db/db'); import Future = require("fibers/future");
import Fiber = require('fibers');
import sb = require('./servicesBase'); export class Document extends sb.ServiceBase { constructor($db) {
super( $db.Document );
this.db = $db;
} db; getList() : IFuture<any> {
return this.getAll();
} } $injector.register('documentServices', Document); // 眼尖的同学会看到这行代码,没错这边将DocumentService注入到容器里面,在接下来的controller中我们就不需要require DocumentService 这个类写一对的路径了
controller/api.ts
///<reference path="../_references.d.ts"/>
import express = require('express'); import services = require('../../services/documentServices'); class Controller { constructor($documentServices) {
this.services = $documentServices; // 我们这边只需要在构造函数里面指定好依赖的名称,yok框架就帮我们做好一切了
} services;// = <services.Document>$injector.resolve('documentServices'); 'get/:name'(req:express.Request, res:express.Response) {
(()=> {
var doc = this.services.findOne({
name: req.params.name
}).wait();
res.send(doc||{});
}).future()();
} '[post]edit'(req:express.Request, res:express.Response) {
(()=> {
var saved = null;
if(!req.body._id) {
saved = this.services.add({
name: req.body.name
, content: req.body.content
}).wait();
res.send(saved);
} else {
saved = this.services.findById(req.body._id).wait();
saved.content = req.body.content;
saved.name = req.body.name;
saved.save(function(){
res.send(saved);
});
}
}).future()()
} rename(req:express.Request, res:express.Response) { } remove(req, res) { } } $injector.register('apiHomeController', Controller); module.exports = $injector.resolve('apiHomeController');
总体来说:
TypeScript 开发很给力,
NativeScript的那套依赖注入也很给力。
使用TypeScript开发一个在线记事本,支持离线存储的更多相关文章
- 利用MVC编程模式-开发一个简易记事本app
学了极客学院一个开发记事本的课程,利用自己对MVC编程模式的简单理解重写了一遍该app. github地址:https://github.com/morningsky/MyNote MVC即,模型(m ...
- 百度AI开放平台 UNIT平台开发在线客服 借助百度的人工智能如何开发一个在线客服系统
这段时间在研究一些人工智能的产品,对比了国内几家做人工智能在线客服的,有些接口是要收费的,有些是免费的,但是做了很多限制,比如每天调用的接口次数限制是100次.后来就找到了百度的AI,大家也知道,目前 ...
- 试着用workerman开发一个在线聊天应用
聊天功能是很常见的一种功能,Workerman是一款开源高性能异步PHP socket即时通讯框架. 什么是Workerman? Workerman是一款 开源 高性能异步 PHP socket即时通 ...
- 我是怎么开发一个小型java在线学习网站的
2016/1/27 11:55:14 我是怎么开发一个小型java在线学习网站的 一直想做一个自己的网站(非博客),但是又不知道做什么内容的好,又一次看到了w3schools,就萌发了开发一个在线ja ...
- 前端每日实战:116# 视频演示如何用 CSS 和原生 JS 开发一个监控网络连接状态的页面
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/oPjWvw 可交互视频 此视频是可 ...
- AppCache 离线存储 应用程序缓存 API 及注意事项
使用ApplicationCache接口实现离线缓存 原文:http://www.mb5u.com/HTML5/html5_96464.html 推荐:html5 application cache遇 ...
- localForage——轻松实现 Web 离线存储
Web 应用程序有离线功能,如保存大量数据集和二进制文件.你甚至可以做缓存 MP3 文件这样的事情.浏览器技术可以保存离线数据和大量的储存.但问题是,如何选择合适技术,如何方便灵活的实现. 如果你需要 ...
- python 开发一个支持多用户在线的FTP
### 作者介绍:* author:lzl### 博客地址:* http://www.cnblogs.com/lianzhilei/p/5813986.html### 功能实现 作业:开发一个支持多用 ...
- Python3学习之路~8.6 开发一个支持多用户在线的FTP程序-代码实现
作业: 开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp s ...
随机推荐
- linux 添加自定义环境变量
1. vi /etc/profile ,在文件末尾加上要定义的环境变量,语法如下: export 变量名=变量值
- 推荐的 CSS 书写顺序
//显示属性 display list-style position float clear //自身属性 width height margin padding border background ...
- SQL排除重复结果只取字段最大值
如何用SQL排除重复结果只取字段最大值的记录?要求得到的结果(即是PID相同的记录只取ID值最大的那一条). select * from [Sheet1$] a from [Sheet1$] wher ...
- VS2010下WPF开发ARCGIS ENGINE 10的带Ribbon控件项目
原文 http://blog.sina.com.cn/s/blog_47522f7f0100nq5t.html 题目好长,但是集目前最新的工具于一身..VS是最新的2010版,不过用的是.net3.5 ...
- mybatis第一个入门demo
学习框架技术,一般先写个demo,先知道是什么,然后在知道为什么,这也是进步的一种. 源码链接:http://pan.baidu.com/s/1eQJ2wLG
- (?m) 标记
<pre name="code" class="html">在和 codec/multiline 搭配使用的时候,需要注意一个问题,grok 正则和 ...
- 《深入了解 Linq to SQL》之对象的标识 —— 麦叔叔呕心呖血之作
序言 很多朋友都向我提过,希望我写一下关于Linq to SQL 或者 VS 插件方面的文章.尽管市面上有很多 Linq to SQL 的书籍,但是都是介绍怎么用,缺乏深度.关于 VS 插件方面的书籍 ...
- UGUI Scrollbar控件
如题就是Scrollbar控件,它简单可以看成 Scrollbar 和 Image组件组成 它基本上不单独使用多数是制作滚动视图.我们来看看他独特的属性,重复的属性就不在介绍了! 属性讲解: Hand ...
- Ubuntu14.04搭建安装svnserver
前两天,公司准备搭建一个svnserver,供大家使用.于是.就先装了一个Ubuntu系统,然后搭建了svnserver的环境.以下把svn搭建的详细过程描写叙述下: 1.安装svn sudo apt ...
- 第四章 Linux环境
程序参数 main函数声明: int main(int argc, char *argv[]) 其中argc是接受到的参数个数,argv是存储参数的字符串数组. 或者声明为: main() 这样也 ...