先贴上源码传送门: 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开发一个在线记事本,支持离线存储的更多相关文章

  1. 利用MVC编程模式-开发一个简易记事本app

    学了极客学院一个开发记事本的课程,利用自己对MVC编程模式的简单理解重写了一遍该app. github地址:https://github.com/morningsky/MyNote MVC即,模型(m ...

  2. 百度AI开放平台 UNIT平台开发在线客服 借助百度的人工智能如何开发一个在线客服系统

    这段时间在研究一些人工智能的产品,对比了国内几家做人工智能在线客服的,有些接口是要收费的,有些是免费的,但是做了很多限制,比如每天调用的接口次数限制是100次.后来就找到了百度的AI,大家也知道,目前 ...

  3. 试着用workerman开发一个在线聊天应用

    聊天功能是很常见的一种功能,Workerman是一款开源高性能异步PHP socket即时通讯框架. 什么是Workerman? Workerman是一款 开源 高性能异步 PHP socket即时通 ...

  4. 我是怎么开发一个小型java在线学习网站的

    2016/1/27 11:55:14 我是怎么开发一个小型java在线学习网站的 一直想做一个自己的网站(非博客),但是又不知道做什么内容的好,又一次看到了w3schools,就萌发了开发一个在线ja ...

  5. 前端每日实战:116# 视频演示如何用 CSS 和原生 JS 开发一个监控网络连接状态的页面

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/oPjWvw 可交互视频 此视频是可 ...

  6. AppCache 离线存储 应用程序缓存 API 及注意事项

    使用ApplicationCache接口实现离线缓存 原文:http://www.mb5u.com/HTML5/html5_96464.html 推荐:html5 application cache遇 ...

  7. localForage——轻松实现 Web 离线存储

    Web 应用程序有离线功能,如保存大量数据集和二进制文件.你甚至可以做缓存 MP3 文件这样的事情.浏览器技术可以保存离线数据和大量的储存.但问题是,如何选择合适技术,如何方便灵活的实现. 如果你需要 ...

  8. python 开发一个支持多用户在线的FTP

    ### 作者介绍:* author:lzl### 博客地址:* http://www.cnblogs.com/lianzhilei/p/5813986.html### 功能实现 作业:开发一个支持多用 ...

  9. Python3学习之路~8.6 开发一个支持多用户在线的FTP程序-代码实现

    作业: 开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp s ...

随机推荐

  1. linux 添加自定义环境变量

    1. vi /etc/profile ,在文件末尾加上要定义的环境变量,语法如下: export 变量名=变量值

  2. 推荐的 CSS 书写顺序

    //显示属性 display list-style position float clear //自身属性 width height margin padding border background ...

  3. SQL排除重复结果只取字段最大值

    如何用SQL排除重复结果只取字段最大值的记录?要求得到的结果(即是PID相同的记录只取ID值最大的那一条). select * from [Sheet1$] a from [Sheet1$] wher ...

  4. VS2010下WPF开发ARCGIS ENGINE 10的带Ribbon控件项目

    原文 http://blog.sina.com.cn/s/blog_47522f7f0100nq5t.html 题目好长,但是集目前最新的工具于一身..VS是最新的2010版,不过用的是.net3.5 ...

  5. mybatis第一个入门demo

    学习框架技术,一般先写个demo,先知道是什么,然后在知道为什么,这也是进步的一种. 源码链接:http://pan.baidu.com/s/1eQJ2wLG

  6. (?m) 标记

    <pre name="code" class="html">在和 codec/multiline 搭配使用的时候,需要注意一个问题,grok 正则和 ...

  7. 《深入了解 Linq to SQL》之对象的标识 —— 麦叔叔呕心呖血之作

    序言 很多朋友都向我提过,希望我写一下关于Linq to SQL 或者 VS 插件方面的文章.尽管市面上有很多 Linq to SQL 的书籍,但是都是介绍怎么用,缺乏深度.关于 VS 插件方面的书籍 ...

  8. UGUI Scrollbar控件

    如题就是Scrollbar控件,它简单可以看成 Scrollbar 和 Image组件组成 它基本上不单独使用多数是制作滚动视图.我们来看看他独特的属性,重复的属性就不在介绍了! 属性讲解: Hand ...

  9. Ubuntu14.04搭建安装svnserver

    前两天,公司准备搭建一个svnserver,供大家使用.于是.就先装了一个Ubuntu系统,然后搭建了svnserver的环境.以下把svn搭建的详细过程描写叙述下: 1.安装svn sudo apt ...

  10. 第四章 Linux环境

    程序参数 main函数声明: int main(int  argc, char  *argv[]) 其中argc是接受到的参数个数,argv是存储参数的字符串数组. 或者声明为: main() 这样也 ...