使用NodeJS来完成AngularJS自定义标签的预编译功能
2013-03-06 23:48
537 查看
相信使用过AngularJS的都知道它的强大,包括MV双向的数据绑定、Dependency Injection和测试功能,当然还包括
本文将要描述的自定义标签的功能,即可通过angular的directive方法定义自定义标签,在DOM加载完后会调用directive的
compile/link函数对自定义标签进行解析,生成任意你想要DOM结构,如<my:tree data-model="someModel" [other attrs]></my:tree>,即可生成一棵树的模样,特别声明:该过程是纯前端,是不是很屌?
不过该过程需要在browser的环境下,因为需要提供BOM对象window, document,是不是就没辙了呢?No, 有解决方案,
NodeJS中有一个模块叫jsdom,是使用纯js产生BOM对象的工具。
好吧,前戏做的差不多了,进正题吧。
第一步,改造angular --- nodejs模块化+去立即函数。将angular的外围立即函数改造成一个普通函数,命名为getAngular,即将原代码
改成
第二步,准备你想要预编译的页面,假设为test.ang,内容如下:
第三步,写上述三个扩展标签的compile/link方法,具体方法不在此赘述,详细请参见:http://docs.angularjs.org/guide/directive
第四步,使用jsdom来生成window, document等BOM对象,具体代码如下:
这时,假如一切顺利的话,在test.html已经能看到你想要的效果了,可以像下边这样,
当然想做成啥样,纯碎取决于你的需求了^_^。
注:本文大部分思想源自黄智大哥(http://weibo.com/u/1929111650) --- 一个对技术有着执着的追求的人。
本文将要描述的自定义标签的功能,即可通过angular的directive方法定义自定义标签,在DOM加载完后会调用directive的
compile/link函数对自定义标签进行解析,生成任意你想要DOM结构,如<my:tree data-model="someModel" [other attrs]></my:tree>,即可生成一棵树的模样,特别声明:该过程是纯前端,是不是很屌?
不过该过程需要在browser的环境下,因为需要提供BOM对象window, document,是不是就没辙了呢?No, 有解决方案,
NodeJS中有一个模块叫jsdom,是使用纯js产生BOM对象的工具。
好吧,前戏做的差不多了,进正题吧。
第一步,改造angular --- nodejs模块化+去立即函数。将angular的外围立即函数改造成一个普通函数,命名为getAngular,即将原代码
(function(window, document, undefined) { ... })(window, document);
改成
function getAngular(window, document) { ... return angular; } exports.getAngular = getAngular;
第二步,准备你想要预编译的页面,假设为test.ang,内容如下:
<my:html> <my:head></my:head> <my:body></my:body> </my:html>
第三步,写上述三个扩展标签的compile/link方法,具体方法不在此赘述,详细请参见:http://docs.angularjs.org/guide/directive
第四步,使用jsdom来生成window, document等BOM对象,具体代码如下:
var jsdom = require("jsdom"), fs = require("fs"), angular = require("angular").getAngular(); jsdom.env({ html: "./test.ang", done: function (errors, window) { var doc = window.document; angular.bootstrap(doc, ["angMod1", "angMod2"]); fs.writeFileSync("test.html", doc.outerHTML, "UTF-8"); } });
这时,假如一切顺利的话,在test.html已经能看到你想要的效果了,可以像下边这样,
<!doctype html> <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <script type="text/javascript" src="http://code.jquery.com/jquery.js"></script> <!-- some css files --> </head> <body> Hello, AngularJS + NodeJS! </body> </html>
当然想做成啥样,纯碎取决于你的需求了^_^。
注:本文大部分思想源自黄智大哥(http://weibo.com/u/1929111650) --- 一个对技术有着执着的追求的人。
相关文章推荐
- 一个完整的Nodejs项目 完成连接数据库(MySQL),登陆、注册功能 session的使用 和发送邮件
- 使用angularJS完成表单验证功能
- Angularjs使用过滤器完成排序功能
- 使用jQuery.AutoComplete完成仿淘宝商品搜索功能
- 使用sqlite3(数据库知识)的接口函数完成一个用户注册功能模块设计 要封装成函数,在独立的main中调用测试
- 使用ASP.NET Atlas AutoComplete Behavior或AutoComplete Extender实现自动完成功能(下)
- 在django中使用自定义标签实现分页功能
- redis使用watch完成秒杀抢购功能
- 使用Ajax技术通过XMLHttpRequest对象完成首页登录功能
- redis使用watch完成秒杀抢购功能
- redis使用watch完成秒杀抢购功能
- 下拉框自动完成(autocomplete)带有分页功能SutaraLumpur-jquery.ajaxComboBox.js的使用
- Node.js 使用angularjs取得Nodejs http服务端返回的JSON数组示例
- 使用select完成goroutine中超时功能
- 完成一个学生管理程序,使用学号作为键添加5个学生对象,并可以将全部信息保存在文件中,可以实现对学生信息的学号查找,输出全部学生信息的功能。
- 使用AVPro Video插件完成切换多个视频播放功能
- MultiAutoCompleteTextView和AutoCompleteTextView两个自动完成功能控件的使用
- 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之完成登录功能
- 使用kdesvn完成tags和branch功能
- 使用Input控件完成站内搜索功能