Blogn - 记录个人历史 Ver 3.0.0
http://www.bloggern.com
首页  留言本  注册  用户名: 密码:  
scala的一些感想(4) -- lift强大的css selector
作者:小猪   2620字节   点击:30192   回复:2285   所属分类:挨踢的人
创建时间:2012-03-14 20:08:06   最后修改时间:2012-03-14 20:08:06  
在继续说scala之前,我觉得我无论如何应该先谈一下lift的css selector。不过,先说点题外话,业界对lift框架的评价褒贬不一,最大的诟病大概就是lift是statefull的,在stateless大行其道的今天,大家天然会对它有所排斥了。我对state没有啥特别的感受,对于大多数应用开发来说,stateless还是statefull本身并不构成太大的影响。另外,就我个人感受来说,lift的source太过复杂了,debug lift简直是一场完美的头脑体操,如果你不嫌累的话。不幸的是,lift的文档也极不完善,因此,想要做一些接近hack的事情的时候是非常辛苦的。嗯,文档,简直就是lift的命门,没法跟我见过的其他任何开发框架相比。。。

不过,lift仍然有它的独到之处,其中一个让我简直无法舍弃的特性,就是css selector。说css selector之前,要先说说lift的模板的设计思想,lift的模板设计有一点让我极度欣赏,那就是绝对不允许任何代码逻辑混入模板,极端的说,lift的模板其实只提供了三个功能,就是模板的插入声明,模板的包含声明,以及一个render tag的设置。没有if,没有loop,所有在其他模板引擎中常见的功能代码,一概没有,你所看到的,就是一个清清爽爽的pure html页面,这以为着什么?这意味着它对前端设计开发人员是极度友好的,前端人员不需要介入任何逻辑代码就可以自由的修改页面,验证效果,而且在页面的所有数据域上都可以自由的写入dummy数据。

那么lift如何将一个充斥着dummy数据的pure html转换成包含动态数据的真实页面呢?可以看看下面的代码片段:

<lift:Timesnippet>
<div id="ct" class="current-time">1900/01/01</div>
</lift:Timesnippet>

这是一个典型的lift模板,lift tag标记表明它所包含的内容应该由哪个snippet负责解释。snippet是lift的概念,是一个scala类或者单子对象实例,大概可以简单的理解为一个render。那么snippet的代码是什么样子呢?

".current-time" #> (new Date()).toString()

就是这样,通过标准的css选择器找到对应的dom节点,然后写入内容。这里只演示了写入普通的文本的情况,实际上,还可以以下的写法,以及我未列出的更多:

id选择器
"#ct" #> ...

属性选择器
"id=ct" #> ...

属性写入
"#ct [href]" #> "http://xxx.xx.xx"

对于多行的列表数据,比如如下的模板

<ul>
<li>x1</li>
<li>x2</li>
<li>x3</li>
</ul>

那么,snippet的代码就像这个样子:


"li" #> datalist.map(item=>{item})

非常简单,最关键的是,这样的写法可以让前端完全关注界面效果,而后端完全关注数据,是我至今为止见过的最完美的视图和数据分离的设计模式。当然,有人会说,毕竟还是引入了lift tag,已经算不上pure html了,不知道下面的写法会不会让人满意一点:



<div id="ct" class="current-time lift:Timesnippet">1900/01/01</div>

或者

<div class="lift:Timesnippet">
<div id="ct" class="current-time">1900/01/01</div>
</div>

暂时就这样吧,又他妈地震了,明天可以再补充点





附件:
评论:

本文允许匿名评论

发表评论:(最长不得超过128KB)
验证码:


您不能对本文发表评论。