Knockout开发中文API系列4–绑定关键字
目的
Visible绑定通过绑定一个值来确定DOM元素显示或隐藏
示例
- <div data-bind="visible: shouldShowMessage">
- You will see this message only when "shouldShowMessage" holds a true value.
- </div>
- <script type="text/javascript">
- var viewModel = {
- shouldShowMessage: ko.observable(true) // Message initially visible
- };
- viewModel.shouldShowMessage(false); // ... now it's hidden
- viewModel.shouldShowMessage(true); // ... now it's visible again
- </script>
参数
主参数
当参数设置为一个假值(例如bool型值false、整型值0、null或者undefined)时,该绑定会设置yourElement.style.display为 none,让元素隐藏。它的优先级高于任何你在CSS中定义的隐藏样式。
当参数设置为一个真值(例如bool型值true、不等于null、Object对象或数组)时,该绑定会去掉yourElement.style.display值,让元素显示。
注意,任何你在CSS中定义的样式会立即应用生效。
如果参数是一个observable值,visible绑定使得元素的visible状态随着参数值的变化而变化。如果参数不是observable值,visible绑定仅仅会设置元素visible状态一次,以后不会再更新。
其他参数
无
注:使用函数或表达式来控制元素显示隐藏
你可以选择使用JavaScript函数或者表达式作为参数值。这样的话,KO将会运行你的函数或者表达式,返回的结果来控制元素显示或者隐藏。
例如:
- <div data-bind="visible: myValues().length > 0">
- You will see this message only when 'myValues' has at least one member.
- </div>
- <script type="text/javascript">
- var viewModel = {
- myValues: ko.observableArray([]) // Initially empty, so message hidden
- };
- viewModel.myValues.push("some value"); // Now visible
- </script>
目的
Text绑定主要是让DOM元素显示参数值。
通常情况下,该绑定在<span>和<em>这样的元素上非常有用,而实际上你可以绑定任何元素。
示例
- Today's message is: <span data-bind="text: myMessage"></span>
- <script type="text/javascript">
- var viewModel = {
- myMessage: ko.observable() // Initially blank
- };
- viewModel.myMessage("Hello, world!"); // Text appears
- </script>
参数
主要参数
Knockout将参数值设置为元素内容。元素之前的内容将会被覆盖。
如果参数是一个observable值,text绑定将会在值变化时更新元素text内容。如果参数不是observable值,text绑定仅仅会设置元素内容一次,以后不会再更新。
如果你传入的不是一个值或者一个字符串(比如:你传入一个对象或者数组)那么显示的文本将是yourParameter.toString()的结果。
其他参数
无
注意事项
注1:使用函数或表达式来决定text值
如果你想text值可编程化,一种选择是创建计算属性,然后在运算函数中编码决定text中显示什么。
例如:
- The item is <span data-bind="text: priceRating"></span> today.
- <script type="text/javascript">
- var viewModel = {
- price: ko.observable(24.95)
- };
- viewModel.priceRating = ko.computed(function() {
- return this.price() > 50 ? "expensive" : "affordable";
- }, viewModel);
- </script>
现在,text值将会在“expensive”和“affordable”之间选择,而这主要取决于“price ”的变化。
然而,假如你按照示例中的方式你则不需要创建计算属性。你可以传入任意的JavaScript表达式进行text绑定。
例如:
- The item is <span data-bind="text: price() > 50 ? 'expensive' : 'affordable'"></span> today.
注2:关于HTML编码
由于text绑定是利用元素的text节点属性来设置文本值,你可以很安全的设置任何内容而不用担心HTML和脚本注入风险。例如,如果你输入以下内容:
- viewModel.myMessage("<i>Hello, world!</i>");
它将不会显示一个斜体文本,而是按原样进行标签输出。
如果你想设置一个HTML内容,你可以参数HTML绑定。
注3:使用“text”而没有一个容器元素
有时你可能需要使用Knockout在不使用多余的元素的情况下通过text绑定来设置文本内容。例如,在option元素中是不允许存在其他元素的,所以下面的绑定是无法正常工作的。
- <select data-bind="foreach: items">
- <option>Item <span data-bind="text: name"></span></option>
- </select>
为了解决这个问题,你可以使用容器语法,它基于一个注释元素。
- <select data-bind="foreach: items">
- <option>Item <!--ko text: name--><!--/ko--></option>
- </select>
<!--ko--> 和<!--/ko--> 注释标记作为起始和结束符,定义一个“虚拟元素”,里面包含了标记,Knockout能够识别这种虚拟元素语法和绑定作为你需要的容器元素而存在。
注4:一个关于IE6 白空格
IE6有一个奇怪的现象,如果span有空格的话,它会变成一个空span,如果你编写以下代码,Knockout不会起任何作用。
- Welcome, <span data-bind="text: userName"></span> to our web site.
IE6不会显示span中间的那个空格,如果你想避免这个问题,你可以在<span>中输入任意内容。比如:
- Welcome, <span data-bind="text: userName"> </span> to our web site.
其他浏览器或者版本较新的IE浏览器不会出现这个问题。
=========================================================
目的
Html绑定会让关联的DOM元素显示你参数指定的HTML内容。
通常当你的ViewModel中值是HTML标记字符串时,使用html绑定来render是非常有用的。
示例
- <div data-bind="html: details"></div>
- <script type="text/javascript">
- var viewModel = {
- details: ko.observable() // Initially blank
- };
- viewModel.details("<em>For further details, view the report <a href='report.html'>here</a>.</em>"); // HTML content appears
- </script>
参数
主要参数
KO会使用你的参数值来设置元素的innerHTML 属性,任何之前的内容将会被重写掉。
如果参数是一个监控属性值,当这个监控属性值发生变化的时候html绑定会更新绑定元素的内容。如果这个参数是非监控属性值,那么html仅绑定元素内容一次并且以后不再去更新它。
如果你传入的参数内容不是字符串或者数字(例如对象或者数组),那么innerHTML 将会等价于yourParameter.toString()。
其他参数
无。
注意:关于HTML编码
由于HTML绑定使用的是innerHTML来设置元素内容,那么你需要注意不要使用不安全的HTML内容,因为这有可能引入脚本注入攻击的风险,如果你不确定它是否安全(比如显示用户输入的内容),请使用text绑定,因为text绑定只设置元素的text内容innerText。
==================================================
目的
Css绑定主要是给DOM元素对象添加或移除一个或多个css class类名。这非常有用,比如当值变成负数的时候用红色高亮显示。
注意:如果你不想应用CSS class,而是采用style属性的话,请采用style绑定。
静态classes示例
- <div data-bind="css: { profitWarning: currentProfit() < 0 }">
- Profit Information
- </div>
- <script type="text/javascript">
- var viewModel = {
- currentProfit: ko.observable(150000) // Positive value, so initially we don't apply the "profitWarning" class
- };
- viewModel.currentProfit(-50); // Causes the "profitWarning" class to be applied
- </script>
当currentProfit 的值小于0的时候将会给元素绑定上profitWarning 样式,当值大于0时移除样式。
动态classes示例
- <div data-bind="css: profitStatus">
- Profit Information
- </div>
- <script type="text/javascript">
- var viewModel = {
- currentProfit: ko.observable(150000)
- };
- // Evalutes to a positive value, so initially we apply the "profitPositive" class
- viewModel.profitStatus = ko.computed(function() {
- return this.currentProfit() < 0 ? "profitWarning" : "profitPositive";
- }, viewModel);
- // Causes the "profitPositive" class to be removed and "profitWarning" class to be added
- viewModel.currentProfit(-50);
- </script>
当currentProfit 值是positive的时候将会给元素绑定上profitWarning 样式,其他情况下将会绑定profitWarning 样式。
参数
主要参数
如果你使用静态的CSS class名称,你可以传递一个属性名是CSS class名,值是true或者false的JavaScript对象来决定DOM元素是否应用class。
你可以一次使用多个CSS class。比如,你的view model含有一个属性isSevere
- <div data-bind="css: { profitWarning: currentProfit() < 0, majorHighlight: isSevere }">
你可以在同一个条件下设置多个CSS class,名称用引号引起来。比如:
- <div data-bind="css: { profitWarning: currentProfit() < 0, 'major highlight': isSevere }">
非bool值会被解析成bool值,比如:0或null会解析成false,像21、 non-null这样的对象会解析成true。
如果你的参数是observable 值,此绑定会在observable 值发生变化的之后添加或移除Css class。如果参数不是observable 值,那么CSS class只会添加或移除一次,以后不再变化。
如果你想使用动态Css class名称,你可以传递一个与Css class名称对应的字符串给你要添加的元素。如果参数是observable 值,绑定会移除元素之前添加的所有css class,并将对应的observable 新值添加给元素。
通常,你可以使用任意JavaScript表达式或者函数作为参数值。KO会自动执行它们通过返回的值来确定元素待添加或移除的Css class。
附加参数
无
注意:应用的Css class名称不能是不合法的JavaScript命名
如果你要添加的Css class名my-class,你不能这样写
- <div data-bind="css: { my-class: someValue }">...</div>
因为my-class不是一个合法的JavaScript命名,解决方案是:在名称两边加上引号作为字符串使用,这样的命名是合法的JavaScript对象。例如:
- <div data-bind="css: { 'my-class': someValue }">...</div>
Knockout开发中文API系列4–绑定关键字的更多相关文章
- Knockout开发中文API系列4–监控属性数组
PS:这个翻译系列好久都没有更新了,实在是不应该,一方面是由于时间不多,另一方面也由于自身惰性太大,从今天起接着更新,会在最近的一月内把这个系列中文API文档翻译完整. 如果你想侦测并响应一个对象的变 ...
- Knockout开发中文API系列3–使用计算属性
计算属性 如果你已经有了一个监控属性 firstName和lastName,如果你想显示全名该怎么做呢?这个时候你就可以通过计算属性来实现,这个方法依赖于一个或多个监控属性,如果任何依赖对象发生改变他 ...
- Knockout开发中文API系列1
从本节开始介绍关于KnockoutJs相关的内容,本节主要介绍knockoutjs一些重要特性与优点,以及它与Jquery等框架库之间的区别. 1.Knockout.js是什么? Knockout是一 ...
- Knockout开发中文API系列2–创建数据模型和监控属性
Observables,这个词的翻译来自汤姆大叔,对于部分翻译不是很准确的,欢迎大家留言,以得到更好的翻译. Knockout是建立在以下3个核心功能之上的: 1. 属性监控与依赖跟踪 2. ...
- flask开发restful api系列(8)-再谈项目结构
上一章,我们讲到,怎么用蓝图建造一个好的项目,今天我们继续深入.上一章中,我们所有的接口都写在view.py中,如果几十个,还稍微好管理一点,假如上百个,上千个,怎么找?所有接口堆在一起就显得杂乱无章 ...
- flask开发restful api系列(1)
在此之前,向大家说明的是,我们整个框架用的是flask + sqlalchemy + redis.如果没有开发过web,还是先去学习一下,这边只是介绍如果从开发web转换到开发移动端.如果flask还 ...
- flask开发restful api系列(7)-蓝图与项目结构
如果有几个原因可以让你爱上flask这个极其灵活的库,我想蓝图绝对应该算上一个,部署蓝图以后,你会发现整个程序结构非常清晰,模块之间相互不影响.蓝图对restful api的最明显效果就是版本控制:而 ...
- flask开发restful api系列(6)-配置文件
任何一个好的程序,配置文件必不可少,而且非常重要.配置文件里存储了连接数据库,redis的用户密码,不允许有任何闪失.要有灵活性,用户可以自己配置:生产环境和开发环境要分开,最好能简单的修改一个东西, ...
- flask开发restful api系列(5)-短信验证码
我们现在开发app,注册用户的时候,不再像web一样,发送到个人邮箱了,毕竟个人邮箱在移动端填写验证都很麻烦,一般都采用短信验证码的方式.今天我们就讲讲这方面的内容. 首先,先找一个平台吧.我们公司找 ...
随机推荐
- linux中WDCP的日志彻底删除技巧
apache或nginx都有开关默认日志,一个是正常访问日志,一个是错误的日志,目录在 /www/wdlinux/nginx-1.0.15/logs /www/wdlinux/httpd-2.2.22 ...
- STM32的JTAG下载模式
SWJ:串行线JTAG配置 (Serial wire JTAG configuration) SWJ(串行线JTAG)支持JTAG或SWD访问Cortex的调试端口. 系统复位后的默认状态是启用SW ...
- C# .net WPF无边框移动窗体
转自 http://download.csdn.net/detail/xiang348352/3095084 WPF无边框移动窗体,先在<Window>里添加 MouseLeftButto ...
- 已安装 SQL Server 2005,安装 SQL Server 2008 时提示需要删除 SQL Server 2005 Express 工具
错误提示:已安装 SQL Server 2005 Express 工具.若要继续,请删除 SQL Server 2005 Express 工具. 解决方案: 修改注册表:HKLM\Software ...
- Serizlizable
关闭 忧郁王子的专栏 伟大的意大利,伟大的罗伯特-巴乔 目录视图 摘要视图 订阅 赠书 | 异步2周年,技术图书免费选 每周荐书:分布式.深度学习算法.iOS(评论送书) ...
- 配置ssh的config文件-为每个ssh连接创建别名
其实选来选去,还是iterm2就够用了,唯一比较麻烦的就是每次都有输入地址和用户名,其实,可以通过配置文件简写的. 可以在 ~/.ssh/config文件写上配置alias信息,以后ssh的时候根据a ...
- [fixed] 解决 slf4j + log4j eclipse 可以打印日志,而在云服务器上不能打印
今天发现服务上没有打印任何日志,而log4j已经设置为了INFO 很奇怪,在eclipse中是可以打印的,也能输出到单独的日志中 后来发现原来是冲突了 把log4j注释掉即可 保留slf4j即可
- 含有按钮的ScrollView在iOS8中无法滚动的解决办法 | ScrollView with UIControl/UIButton subviews not scrollable under iOS 8
转自:http://zcw.me/blogwp/%E5%90%AB%E6%9C%89%E6%8C%89%E9%92%AE%E7%9A%84scrollview%E5%9C%A8ios8%E4%B8%A ...
- ZOJ Problem Set - 1004-Anagrams by Stack
唉!先直接上源码吧!什么时候有时间的再来加说明. #include<iostream> #include<vector> #include<stack> #i ...
- 从头认识java-15.7 Map(5)-介绍HashMap的工作原理-Key变了,能不能get出原来的value?(偶尔作为面试题)
这一章节我们讨论一个比較特殊的情况Key变了,能不能get出原来的value? 答案是:有时能够,有时不能够 1.能够的情况: package com.ray.ch14; import java.ut ...