我需要一个可以绑定DOM的SPA框架
在用Backbone两次之后,我终于无法忍受它的原始和简陋。虽然Backbone不是一个SPA框架,而只是个javascript的MVC框架罢了。以SPA框架去强求它,的确是不公平的。不过,我还是渴望用一个可以绑定DOM的SPA框架。
在用Backbone编程的时候,你需要把代码划分为model和view两层。虽然Backbone声称是MVC(Model View Collection)框架,但是Collection其实也应该划分到Model类别中。
Model层负责放置数据,而view层负责展示数据和接受用户的操作事件。在这里,view层相当于一般的MVC架构中controller加view的组合。当然,在这样的组合中,就不要指望将view和controller分离了。不过这个不是我现在要吐槽的问题。问题是,controller无法自动地更新view。
让我们看看Backbone中model和view是怎么协作的。首先view接收事件,然后修改绑定的model,再用model的数据更新页面(或者由model驱动被绑定的view更新)。这样一来,controller的更新,就依赖于model层对脏数据的处理了。model层在产生脏数据之后,必须去触发view层更新。如果没有及时更新,就会发生数据混乱的问题。所以,model层需要紧密地和view层绑定。每次model的数据改变后,都需要要相应的方法来改变对应的页面内容。这个方法既可以放在model层中,也可以放在view层之中。
结果是,对应于model的每个状态,都需要有对应的方法来更新页面。这么说来你需要写两套方法,一套方法来响应用户对页面的动作,并反馈给受绑定的model;另一套方法用于使用model层最新的数据,更新页面。哦对了,你还要手工绑定model和view,有时还需要双向绑定喔。这么多方法,不但写起来麻烦,维护起来也麻烦。
如果SPA框架可以绑定具体的DOM,然后由此实现对应的MVC,那该多好呀!
这么一来,不但立刻有了现成的接口可用,而且SPA带来的页面不会刷新的问题也能解决了。再也不需要在view层中显式记录当前DOM的状态了,只需要交由框架自动处理了。view层的职责又能卸下一大块。
如果能更进一步,以前端的每一个model对应后台的每一个model,然后可以像定义路由表一样定义model的方法,调用该方法自动调用同名的RESTful 方法,那就更加方便了,不再需要依靠少的可怜的几个同步方法,不再手工写$.ajax了。