首页 新闻 会员 周边

谁能介绍下javascript ORM,有个例子说明就更好了。不要介绍框架,要的是实现的思路。

0
悬赏园豆:20 [已解决问题] 解决于 2012-09-10 08:53

如题,在富客户端开发的今天,对javascript也要进行MVC的分层了。急需一个能进行数据管理的javascript ORM,简单的实现就可以,不要框架。

飞船的主页 飞船 | 初学一级 | 园豆:13
提问于:2012-08-24 09:02
< >
分享
最佳答案
2

@飞船: 先说说ORM: 服务器端的ORM框架主要是对与数据库交互的接口进行封装并提供出更加友好易用的接口,让使用框架的上层应用不需要关心与数据库交互的具体细节。前端的ORM框架主要就应该是要对与服务器的数据交互进行封装。说白了都是要对DAO层进行封装,只不过要封装的对象不一样而已。同样的,前端ORM主要就是封装CRUD四种基本类型的操作。举个例子:拿发帖来说,1个简单的帖子的原始数据类似于:

var modelData = {
        "subject" : "主题",
        "content" : "内容",
        "createUserId" : "chenboxiang"
    }

先需要一个Model的类用来封装modelData,并提供CRUD的接口:

function Model(modelData) {
        this.modelData = modelData;
    }
    
    Model.prototype.get = function(attrName) {
        return this.modelData[attrName];
    }
    
    Model.prototype.read = function() {
        
    }
    
    Model.prototype.save = function() {
        // 里面判断是要create还是update
    }
    
    Model.prototype.del = function() {
        
    }

这是一个simple的base Model类,里面提供几个最基础的接口:1. 对attrs的获取 2.对model的CRUD操作.其他的自定义Model类只需要继承它即可。不过通过上面的接口可以看出,要达到复用统一的base model需要规范几点:1. 与服务器端的CRUD的交互方式应该是统一的,例如指定model对应url或者一种通用的url拼接方式,然后CRUD的操作都是通过同1个url加上不同的http method来跟服务器端进行交互 2. 所有业务逻辑必须基于上述统一的思路来做实现。

再谈谈事件:光有Model跟服务器端的交互是不够的,数据交互完了还需要反馈到页面表现上,这就是涉及到Model跟View的交互了。用户对view的操作导致产生的与服务器端的数据交互,通常是通过view去持有对应的model对象,相应的事件触发时,view直接去调用model对应的方法与服务器端进行交互。服务器端有了反馈以后view需要对应的变化怎么办呢,一般是通过事件触发的方式,也即你说的订阅/发布。model变更了会发布1个事件,view去监听他持有的model的对应的变更事件作出响应即可,这样view只需要关心model是否有变更即可,而不需要关心其它细节。simple code:

Model.prototype.save = function() {
        // 里面判断是要create还是update
        
        // 发布事件
        this.trigger("change");
    }

function View(model) {
        this.model = model;
        this.model.on("change", this.render);
    }
    
    View.prototype.render = function() {
        
    }

抱歉,上面忘了说了,这里还需要用到1个类就是Event, 必须先实现1个Event的类用来做事件的发布与订阅功能,然后Model继承Event类即可拥有发布和订阅事件的功能。实现原理其实也很简单,就是维护一个事件和处理函数列表的hashMap, 事件名称为key,value为处理函数列表,on的时候将处理函数插入对应的处理函数列表,trigger的时候循环调用处理函数列表里的函数即可。

因为你的问题比较大,所以我只能以我的理解大概说了下,看你的意思像是要自己去做各部分的实现,我建议你还是直接用现有的mvc框架比较好。开始可以选个轻量级的,例如:backbone

收获园豆:20
疯骚的程序员 | 菜鸟二级 |园豆:308 | 2012-09-09 16:44

谢谢大师!很精彩,通俗易懂!

飞船 | 园豆:13 (初学一级) | 2012-09-10 08:53
其他回答(2)
0

你是说NodeJS开发还是想要在浏览器端操作数据库??如果是后者你觉得可能吗?

zhangweiwen | 园豆:904 (小虾三级) | 2012-08-24 10:13

这个的意思不是说用javascript直接操作后台数据库,这里的意思是使用ORM的思想去管理前端的数据,尤其是前端数据比较复杂的情况下。而且现在有的浏览器已经支持“Web Storage”,你提到的以后肯定会用到。在富客户端应用中,js采用MVC分层,使用发布/订阅模式。

支持(0) 反对(0) 飞船 | 园豆:13 (初学一级) | 2012-08-25 08:34
0

js可以直接对数据库进行管理? 除NodeJS以外,你如果在游览器中,这样的操作行吗?

chenping2008 | 园豆:9836 (大侠五级) | 2012-08-24 13:30

这个的意思不是说用javascript直接操作后台数据库,这里的意思是使用ORM的思想去管理前端的数据,尤其是前端数据比较复杂的情况下。而且现在有的浏览器已经支持“Web Storage”,你提到的以后肯定会用到。在富客户端应用中,js采用MVC分层,使用发布/订阅模式。

支持(0) 反对(0) 飞船 | 园豆:13 (初学一级) | 2012-08-25 08:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册