Knockout2.x开发 第十七章:模板(template)绑定
2013-05-05 17:49 阅读(173)

template绑定通过模板将数据render到页面。模板绑定对于构建嵌套结构的页面非常方便。 Knockout可以使用流行的jquery.tmpl模板引擎,使用它的话,需要下载jquery.tmpl和jQuery库,然后引入到页面中。而从Knockout2.0开始有了自己的模板框架,虽然功能上不如jquery.tmpl丰富,但也足够满足需要。下面仅从Knockout自己的模板说下,使用方法和jquery.tmpl是相同的。


基本用法

Html代码

<div data-bind="template: { name: 'person-template', data: buyer }"></div>
<div data-bind="template: { name: 'person-template', data: seller }"></div>
Js代码

<script type="text/html" id="person-template">
   <h3 data-bind="text: name"></h3>
   <p>Credits: <span data-bind="text: credits"></span></p>
</script>
<script type="text/javascript">
     function MyViewModel() {
	     this.buyer = { name: 'Franklin', credits: 250 };
		 this.seller = { name: 'Mario', credits: 5800 };
	 }
	 ko.applyBindings(new MyViewModel());
</script>

使用foreach

Html代码

<div data-bind="template: { name: 'person-template', foreach: people }"></div>
Js代码

<script type="text/html" id="person-template">
    <h3 data-bind="text: name"></h3>
	<p>Credits: <span data-bind="text: credits"></span></p>
</script>
<script type="text/javascript">
function MyViewModel() {
     this.people = [
	 { name: 'Franklin', credits: 250 },
	 { name: 'Mario', credits: 5800 }
	 ]
}
ko.applyBindings(new MyViewModel());
</script>

使用afterRender选项

有时候,你需要在模板生成的DOM元素上深度定义逻辑。例如,你可能想再模板输出的时候进行截获,然后在render的元素上允许jQuery UI命令(比如date picker,slider,或其它)。

你可以使用afterRender选项,简单声明一个function函数(匿名函数或者view model里的函数),在render或者重新render模板之后Knockout会重新调用它。如果你使用的是foreach,那在每个item添加到observable数组之后, Knockout会立即调用afterRender的callback函数。例如,

Html代码

<div data-bind="template: { name: 'person-template', data: buyer, afterRender: myPostProcessingLogic  }"></div>
Js代码
<script type="text/html" id="person-template">
   <h3 data-bind="text: name"></h3>
   <p>Credits: <span data-bind="text: credits"></span></p>
</script>
<script type="text/javascript">
     function MyViewModel() {
	     this.buyer = { name: 'Franklin', credits: 250 };
	     this.myPostProcessingLogic = function (elements) {
                  //添加一些后处理,当前模板render后会执行;
             }
     }
     ko.applyBindings(new MyViewModel());
</script>

动态决定使用哪个模板


有时候,你可能需要根据数据的状态来决定使用哪个模板的ID。可以通过function的返回ID应用到name选择上。如果你用的是foreach模板模式, Knockout会对每个item执行function(将item作为参数)从而将返回值作为ID,否则,该function接受的参数是整个 data option或者是整个view model。

Html代码

<div data-bind="template: { name: displayMode, foreach: people }"></div>
Js代码

<script type="text/html" id="person-template1">
    <h1>使用person-template1模板</h1>
    <h3 data-bind="text: name"></h3>
	<p>Credits: <span data-bind="text: credits"></span></p>
</script>
<script type="text/html" id="person-template2">
    <h1>使用person-template2模板</h1>
    <h3 data-bind="text: name"></h3>
	<p>Credits: <span data-bind="text: credits"></span></p>
</script>
<script type="text/javascript">
function MyViewModel() {
     this.people = [
	   { name: 'Franklin', credits: 250, active: ko.observable(true)  },
	   { name: 'Mario', credits: 5800, active: ko.observable(false) }
	 ];
	 this.displayMode =  function (employee) {
        return employee.active() ?"person-template1" : "person-template2";
     }

}
ko.applyBindings(new MyViewModel());
</script>

定义了俩个模板:person-template1和person-template2。同时template绑定的name值也不是直接的模板ID,而是一个函数(displayMode),通过这个函数返回的ID值来选择使用哪个模板。



jQuery.tmpl使用简述

如果要使用引擎,需要同时具备如下js库:

<script src="http://code.jquery.com/jquery-1.7.1.min.js"></script> 
<script src="http://github.com/downloads/SteveSanderson/knockout/jquery.tmpl.js"></script>
<script src="knockout-x.y.z.js"></script>
对于上面所讲的jQuery.tmpl都支持,即使用上是相同的。当然jQuery.tmpl还会有自己的特性,对这个感兴趣的可以在查看相关的文档。