目的

模板绑定使用数据render模板,然后把渲染的结果填充到Dom树中。模板通过重复或嵌套块(通常为您的视图模型数据的函数)用一种简单,方便的方式来建立复杂的UI结构 。

有两种方式使用模板:

  • Native templating它由foreach, if, with,或其它控制流绑定(control flow bindings)组成 。 这些控制流绑定捕捉包含你指定的所有HTML标记,把它作为模板来呈现任意数据项目,此特性由Knockout内置,无需任何扩展库。
  • String-based templating   Knockout使用第三方模板引擎来支持字符串模板. Knockout 通过传入字符串参数,调用扩展模板库,将返回字符串注入文档中. 以下例子使用 jquery.tmpl 和 Underscore 模板引擎.

参数

  • 主要参数

    • 简化语法: 如果你使用一个字符串值, KO 将把它使用一个模板ID来呈现. 它提供的数据模板将是你的当前模型对象.

    • 复杂控制, 通过以下方式的Javascript 对象来绑定:

      • name —包含你想呈现的模板ID  - 参见 Note 5 .
      • data — 你想呈现的data对象. 如省略此参数, KO 将查找 foreach 参数, or will fall back on using your current model object.
      • if — 如有此参数, 则在if表达式为true时渲染模板.例如:先判断观察对象为空,再决定是否绑定模板
      • foreach — 通过“foreach” 循环进行绑定- 参见 Note 2  .
      • as — 使用 foreach时,用于定义别名 - 参见Note 3 .
      • afterRender, afterAdd, or beforeRemove — 渲染元素的回调函数 -参见 Note 4

Note 1: 渲染命名 template

一般说来,如果使用控制流绑定 (foreach, with, if, etc.)时,无需给模板命名: 你的Dom元素中已经隐式的给它命名了. 但你也可以显式的给模板命名,并引用它

<h2>Participants</h2>
Here are the participants:
<div data-bind="template: { name: 'person-template', data: buyer }"></div>
<div data-bind="template: { name: 'person-template', data: seller }"></div> <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>

上例中,person-template 被使用了两次:buyer 一次, seller一次. 注意:模板被包裹在 <script type="text/html">标记中,type 属性是必须的,用于区别正常的javascript代码, 不会被Knockout 当作标记来绑定.

命名模板并不常用,但有的时候能派上用场.

Note 2: 在命名模板中使用“foreach”项

以下方式在命名模板中使用foreach:

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

其实,下面的代码使用foreach是最直接的,无需命名模板:

<div data-bind="foreach: people">
<h3 data-bind="text: name"></h3>
<p>Credits: <span data-bind="text: credits"></span></p>
</div>

Note 3: 通过as给 “foreach”项一个别名

使用as 将有助于更好的使用foreach. 例如:

<ul data-bind="template: { name: 'employeeTemplate',
foreach: employees,
as: 'employee' }"></ul>

注意: 'employee' 通过 as与foreach中的项相关联了.现在你可以在foreach 循环中通过 employee来访问foreach项,达到更好控制渲染的目的

此功能主要用于foreach嵌套, 以下示例展示了上层循环season如何控制下层循环month的:

<ul data-bind="template: { name: 'seasonTemplate', foreach: seasons, as: 'season' }"></ul>

<script type="text/html" id="seasonTemplate">
<li>
<strong data-bind="text: name"></strong>
<ul data-bind="template: { name: 'monthTemplate', foreach: months, as: 'month' }"></ul>
</li>
</script> <script type="text/html" id="monthTemplate">
<li>
<span data-bind="text: month"></span>
is in
<span data-bind="text: season.name"></span>
</li>
</script> <script>
var viewModel = {
seasons: ko.observableArray([
{ name: 'Spring', months: [ 'March', 'April', 'May' ] },
{ name: 'Summer', months: [ 'June', 'July', 'August' ] },
{ name: 'Autumn', months: [ 'September', 'October', 'November' ] },
{ name: 'Winter', months: [ 'December', 'January', 'February' ] }
])
};
ko.applyBindings(viewModel);
</script>

注意: 别忘记给值加上引号 (e.g., as: 'season', 别写为 as: season),

Note 4: 使用“afterRender”, “afterAdd”, and “beforeRemove”

有时需要定制生成模板的逻辑。例如,当你使用 jQuery UI组件时, 可能需要将模板转化为对应的各种控件.

一般说来, 使用 custom binding,来处理以上需求较好,但有可能你也需要访问原始的模板生成dom元素,此时,你可以使用afterRender.

渲染模板之后.KO将调用afterRender .如果使用了 foreach, Knockout 将在每个项加到observable数组后回调 afterRender.例如:

<div data-bind='template: { name: "personTemplate",
data: myData,
afterRender: myPostProcessingLogic }'> </div>
.....
viewModel.myPostProcessingLogic = function(elements) {
// "elements" is an array of DOM nodes just rendered by the template
// You can add custom post-processing logic here
}

如果在foreach只想处理增加和删除, 可使用afterAddbeforeRemove 来代替,参见文档 foreach binding.

Note 5: 动态选择模板

如果有多个模板, 可使用回调函数来决定使用哪一个,当然函数们得有自己的name。如果使用的是foreach模板, KO在每次foreach项的时候都会执行函数,其参数为整个item对象。.Otherwise, the function will be given the data option’s value or fall back to providing your whole current model object.

例如:

<ul data-bind='template: { name: displayMode,
foreach: employees }'> </ul> <script>
var viewModel = {
employees: ko.observableArray([
{ name: "Kari", active: ko.observable(true) },
{ name: "Brynn", active: ko.observable(false) },
{ name: "Nora", active: ko.observable(false) }
]),
displayMode: function(employee) {
// Initially "Kari" uses the "active" template, while the others use "inactive"
return employee.active() ? "active" : "inactive";
}
}; // ... then later ...
viewModel.employees()[1].active(true); // Now "Brynn" is also rendered using the "active" template.
</script>

如果在函数中使用 observable 值, 那么它的值更新后对应的绑定也会更新. 这样数据就可以选择合适的模板来呈现。

如果在函数中使用了第二个参数,那它将作为 binding context对象来处理.当动态选择模板时,你可以访问$parent 或其它的 binding context 变量 。例如:

displayMode: function(employee, bindingContext) {
// Now return a template name string based on properties of employee or bindingContext
}

KnockOut文档--模板绑定的更多相关文章

  1. DDD领域驱动设计 - 设计文档模板

    设计文档模板: 系统背景和定位 业务需求描述 系统用例图 关键业务流程图 领域语言整理,主要是整理领域中的各种术语的定义,名词解释 领域划分(分析出子域.核心域.支撑域) 每个子域的领域模型设计(实体 ...

  2. “Word自动更改后的内容保存到通用文档模板上。是否加载该模板?“的解决办法

    在win7系统下,Word2010出现了不能正常关闭.打开一个已有word文档,点击右上角关闭按钮后,先提示"word已停止工作,windows正在检查该问题的解决方案",随后提示 ...

  3. 魔改——MFC MDI程序 定制 文档模板 运行时全部打开 禁用关闭按钮

    ==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...

  4. 自定义WIZ文档模板

    WIZ文档模板 1.在wiz笔记里面新建一个笔记,并将其做成一个模板 例子: 2.该作为模板的笔记制作完成后,右键-高级-另存为  导出为html格式 3.将导出的文件和文件夹(有时候只有一个htm文 ...

  5. Java中常用到的文件操作那些事(一)——替换doc文档模板,生成真实合同案例

    工作中,我们时常会遇到一些操作文件的操作,比如在线生成合同模板,上传/下载/解析Excel,doc文档转为pdf等操作.本文就已工作中遇到的在线生成合同为例,简要地介绍一种文档替换写法. 本文目的:给 ...

  6. Dynamics CRM 2015/2016新特性之七:有了文档模板,打印分析So Easy

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复190或者20160216可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 从CRM 2015 UR1开始, ...

  7. Pycharm文档模板变量

    点击这里查看JetBrains官方英文源文件 本篇Blog只是搬运外加大概翻译一下. File template variables A file template can contain varia ...

  8. Python之word文档模板套用 - 真正的模板格式套用

    Python之word文档模板套用: 1 ''' 2 #word模板套用2:套用模板 3 ''' 4 5 #导入所需库 6 from docx import Document 7 ''' 8 #另存w ...

  9. 五分钟轻松搞定产品需求文档!这可能史上最全PRD文档模板

    本文由  @JustWu 原创发布于社区 为什么写这篇文章? 第一:写PMCAFF的PRD文档,大家都是用户,比较好参考与理解,方便大家来找我写的不好的地方. 第二:我在自学PRD文档的编写过程中,总 ...

随机推荐

  1. getch()、getche()和getchar()函数

    原文:getch().getche()和getchar()函数 getch().getche()和getchar()函数(1) getch()和getche()函数 这两个函数都是从键盘上读入一个字符 ...

  2. 多线程之线程池Executor应用

    JDK1.5之后,提供了自带的线程池,以便我们更好的处理线程并发问题. Executor类给我提供了多个线程池创建的方式: 创建固定的线程池 Executors.newFixedThreadPool( ...

  3. 使用Net.Mail、CDO组件、JMail组件三种方式发送邮件

    原文:使用Net.Mail.CDO组件.JMail组件三种方式发送邮件 一.使用Net.Mail 需要服务器认证,大部分服务器端口为25. { MailMessage mailMsg = mailMs ...

  4. springbatch操作CSV文件

    一.需求分析 使用Spring Batch对CSV文件进行读写操作: 读取一个含有四个字段的CSV文件(id, name, age, score), 对文件做简单的处理, 然后输出到还有一个csv文件 ...

  5. libvlc media player in C# (part 2)

    原文 http://www.helyar.net/2009/libvlc-media-player-in-c-part-2/ I gave some simplified VLC media play ...

  6. .NET源代码的内部排序实现

    使用JetBrains的DotPeek工具能够方便地查看.net的部分源代码.于是看了一下.NET的内部是怎样实现排序的算法. 在System.Collections.Generic 命名空间下能够看 ...

  7. Windows在结构objective C开发环境

    对于近期打算iPhone.iPod touch和iPad开发一些应用程序,所以.需要开始学习Objective C(苹果推出的类似C语言的开发语言).因为苹果的自我封闭的产业链发展模式(从芯片.机器. ...

  8. Android Studio如何设置自己主动提示代码

    同Eclipse时间,您可以设置,无论你是设置输入不管什么信,可以提示码,在Android Studio也可以 设置.并且比Eclipse设置来的简单. 当然假设你认为代码自己主动提示会减少你的代码水 ...

  9. 程序猿必要10免费的钱jquery小工具

    本周带来10款免费的jquery插件.假设你也有好的作品,欢迎分享到社区中来,在得到帮助的同一时候,也能与很多其它人分享来自你的作品. jQuery导航菜单置顶插件 - stickyUp . 在线演示 ...

  10. python网络爬虫进入(一)——简单的博客爬行动物

    最近.对于图形微信公众号.互联网收集和阅读一些疯狂的-depth新闻和有趣,发人深思文本注释,并选择最佳的发表论文数篇了.但看着它的感觉是一个麻烦的一人死亡.寻找一个简单的解决方案的方法,看看你是否可 ...