作者:小猪
2620字节
点击:30199
回复:2285
所属分类:挨踢的人
在继续说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>
暂时就这样吧,又他妈地震了,明天可以再补充点