1.CBS初步(本文)
2.Knot.js Debugger
....持续增加中
学习Knot.js,实际上就是学习如何使用CBS。CBS使用和CSS类似的原理,将绑定逻辑从HTML中提取出来,大大地增加了系统的可维护性。
我关于Knot.js介绍的第一篇博文发表之后,有一位朋友敏锐地指出CSS设计的最重要目的之一就是复用,而CBS因为是对逻辑而不是样式的描述,复用性并不像样式那么强,那么CBS存在的意义又在哪里呢?
实际上CBS和CSS虽然原理类似,形式类似,但设计目的却很不一样。 绑定逻辑虽然复用性不如样式,但它会比样式复杂得多。在HTMLtag那么有限的空间里塞入大量的逻辑描述显然对于维护性是极为不利的。CBS就是为了解决这个问题。CBS比CSS在形式上最大的不同在于CBS可以嵌套(对,就像LESS一样),最终形成的CBS会自然和HTML结构保持一致,非常便利。同时独立出来的CBS也能在不影响阅读性的前提下嵌入大量的绑定逻辑,你会发现实用中的CBS中往往包含了大量的javascript嵌入函数,这些逻辑如果硬塞入HTML或者放回Javascript都不会有在CBS中那么自然恰当。
到http://knotjs.com/download/latest下载knot.js的最新版本。压缩包里有压缩过的knot.js主文件和debugger,引用knot.min.js,你就能在网页里使用CBS了。
<script src="[PATH_TO_KNOTJS]/knot.min.js"></script>
如果要开启Debugger(开发和学习时推荐开启),再引用下Debugger的js文件knot.debug.js就好。注意启用Debugger对性能会有较大影响,请务必在发布前移除Debugger。
<script src="[PATH_TO_KNOTJS]/debugger/knot.debug.js"></script>
注意你必须从一个web服务器上打开你的网页,否则因为安全原因,Debugger可能无法工作。另外Debugger必须和你的网页在一个域中。
好了,让我们开始看看CBS的基本语法吧:
CBS语法中各个部件解释如下:
关于Access Point我们后面会有更多的介绍。如果你现在就想了解更多,请参看这里: Access Point @GitHub
body{ dataContext: /model }
以上代码将Javascirpt全局对象model设置为"body"元素的数据上下文。
/* 这是比较“传统”的,css式的做法 */.example input{value:name;}.example .message{text: name;}/* 改写为CBS的嵌套形式后是这样 */.example{ -> input{value:name;}; -> .message{text: name;};}
<script type="text/cbs" src="[PATH_TO_CBS]/example.cbs"></script>
<input type="text" binding="value:name">
下面我们来看一个具体的简单例子。这个例子就是我们在第一篇文章末尾提到的例子,只是做了一点点修改,加入了一个javascript对象。输入姓名,显示一个问候语。你可以点击这个链接:knot.js英文版tutorial去试用这个例子。
数据流图是这样的:
HTML:
<div class="knot_example"> <h3>Greeting from knot.js (V2)</h3> <p> <label>Input your name here: </label> <input type="text"> </p> <p> Hello <b class="helloString"></b> </p></div>
Javascript:
//直接使用一个最简单的javascript对象做modelwindow.greetingModel = {name:"Alex"};
CBS:
<script type="text/cbs">.knot_example { /* 设置dataContext为Javascript全局对象 window.greetingModel */ dataContext: /greetingModel; /* 绑定value到name. 因为当前Data Context是window.greetingMode, 所以这个设置也能写为 "value[immediately:1]: /greetingModel.name" "[immediately:1]" 是一个绑定选项,表示每次击键都更新数据。默认为0,表示焦点移出文本框才更新数据 */ -> input{ value[immediately:1]: name; }; /*绑定 text到 name, 同样的,因为Data Context的存在,最终绑定到window.greetingModel.name*/ -> .helloString{ text: name; }}</script>
关于CBS,请注意以下这些点:
Knot.ready(function(succeed, err){ if(!succ) { global.alert(err.message); return; } // your own code....}
.title{ text: title }
/* 双向绑定,但因为text不支持,所以最后实际结果就是一个单向绑定 */.helloString{text: name;}/* 单向绑定,和上面的完全等价 */.helloString{text <= name;}
支持双向绑定的HTML访问点的列表请看这里:Observable HTML Access Point List @GitHub
如果你对knot.js感兴趣,请关注我以获取后续更新提醒。同时请点击推荐此文,knot.js需要足够的注意力来吸引开发者和建立自己的社区。
knot.js感谢你的支持。
新闻热点
疑难解答