KnockoutJS 3.X API 第四章 数据绑定(1) UI绑定

目录

本节将介绍六种文本绑定方式:

  1. visible绑定

  2. text绑定
  3. html绑定
  4. css绑定
  5. style绑定
  6. attr绑定

可见文本绑定(visible)

使用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>

参数:

  • 主要技术参数

    • 当参数解析为(例如,布尔值false,或数字值0,或者null,或undefined),则当前元素隐藏,如同CSS样式中display:none。

    • 当参数解析为(例如,布尔值true,或者一个非null对象或序列)中,使其成为可见的。

使用函数和表达式来控制元素的可见性

您还可以使用JavaScript函数或任意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)

使用text绑定到相关的DOM,以显示视图模型属性的值。可用于任何DOM元素上

例如:

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>

使用函数和表达式来作为文本值

例如:

The item is <span data-bind="text: priceRating"></span> today.

<script type="text/javascript">
    var viewModel = {
        price: ko.observable(24.95)
    };
    viewModel.priceRating = ko.pureComputed(function() {
        return this.price() > 50 ? "expensive" : "affordable";
    }, viewModel);
</script>

也可以写为如下等同格式:

The item is <span data-bind="text: price() > 50 ? ‘expensive‘ : ‘affordable‘"></span> today.

HTML编码

在给视图属性赋值时,默认KO时进行HTML编码的,也就是说,如果赋值的是带有DOM标记或者JS脚本的值,一律会原封不动的显示。不会造成安全隐患或脚本注入等情况。

例如:

viewModel.myMessage("<i>Hello, world!</i>");

只会显示<i>Hello,workld!</i>,而不是斜体文本hello world

使用无容器的text绑定

在某些情况下,可能不允许在UI中加入新的dom元素作为KO的text绑定容器,比如下边的这个例子,如果在option元素中再加入新的span元素,将导致无法正常工作:

<select data-bind="foreach: items">
    <option>Item <span data-bind="text: name"></span></option>
</select>

在这种情况中,可以使用ko自带的无容器绑定写法:<!--ko--><!--/ko-->,使用这种写法,ko会虚拟出一个容器元素作为绑定使用。

<select data-bind="foreach: items">
    <option>Item <!--ko text: name--><!--/ko--></option>
</select>

HTML绑定

次绑定方式主要用于显示HTML相关的DOM元素,具体的讲就是将包含HTML元素的视图模型属性渲染到UI上。例如:

<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>

这种方式要注意的是脚本注入攻击,切勿将该方式用于用户输入。

CSS绑定

目的:

CSS绑定主要用于对DOM元素的CSS类添加或删除,这种方式是很有用的,当然Jquery也能做到这一点。

静态例子:

<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时,将移除div元素的profitWarning的css类。

动态例子:

<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.pureComputed(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视图属性值小于0时,div元素的添加css类profitWarning,否则添加css类profitPositive。

注意:

你可以设置一个或多个CSS绑定,来实现多个绑定需求:

<div data-bind="css: { profitWarning: currentProfit() < 0, majorHighlight: isSevere }">

你甚至也可以用引号把CSS类名括起来:

<div data-bind="css: { profitWarning: currentProfit() < 0, ‘major highlight‘: isSevere }">

在视图模型属性返回值中,0null被视为false,非null或非零的值被视为true

如果视图模型属性是一个监控属性类型(observable),那么之后的css绑定将根据模型属性的值变化而变化,如果你的视图模型属性不是一个监控属性,那只有第一次运行会变化,之后将不会改变。在动态CSS绑定中同样适用该规则。

二次注意:

如果你要添加的CSS类名是my-class,如果你像下边这种写法的话,将没有效果

<div data-bind="css: { my-class: someValue }">...</div>

因为my-class这种名字是不合法的在KO的CSS绑定中,解决这个问题最简单的方法是加上引号:

<div data-bind="css: { ‘my-class‘: someValue }">...</div>

Style绑定

目的:

style绑定与CSS绑定类似,只是style绑定是添加或删除一个或多个元素样式,例如:

<div data-bind="style: { color: currentProfit() < 0 ? ‘red‘ : ‘black‘ }">
   Profit Information
</div>

<script type="text/javascript">
    var viewModel = {
        currentProfit: ko.observable(150000) // Positive value, so initially black
    };
    viewModel.currentProfit(-50); // Causes the DIV‘s contents to go red
</script>

上述例子是将div元素的color样式赋值,当currentProfit视图模型属性的值小于0时,赋值red,否则赋值black;

与CSS绑定一样,style绑定也支持多个参数同时绑定。比如:

<div data-bind="style: { color: currentProfit() < 0 ? ‘red‘ : ‘black‘, fontWeight: isSevere() ? ‘bold‘ : ‘‘ }">...</div>

如果视图模型属性是一个监控属性类型(observable),那么之后的style绑定将根据模型属性的值变化而变化,如果你的视图模型属性不是一个监控属性,那只有第一次运行会变化,之后将不会改变。

注意:

如果你需要绑定一些style,例如font-weight或者text-decoration

  • 不要写成这样 { font-weight: someValue }; 要写成这样{ fontWeight: someValue }

  • 不要写成这样 { text-decoration: someValue }; 要写成这样{ textDecoration: someValue }

更多的Style绑定的KO写法请点击这个地址查看

attr绑定

目的:

attr绑定主要是为了通过KO设置元素的值,比如img标签的src值,a标签的href值和title值。例如:

<a data-bind="attr: { href: url, title: details }">
    Report
</a>

<script type="text/javascript">
    var viewModel = {
        url: ko.observable("year-end.html"),
        details: ko.observable("Report including final year-end statistics")
    };
</script>

上述例子将设置DOM上a标签的href为year-end.html,设置a标签的title为Report including final year-end statistics。

注意:

如果你像更改元素的data-something属性的值时,不可以写成下main这样:

<div data-bind="attr: { data-something: someValue }">...</div>

因为data-something是KO中不合法的标识名称。最简单的方法是用引号括住:

<div data-bind="attr: { ‘data-something‘: someValue }">...</div>
时间: 2024-12-29 11:38:54

KnockoutJS 3.X API 第四章 数据绑定(1) UI绑定的相关文章

KnockoutJS 3.X API 第四章 数据绑定(5) 控制流component绑定

本节目录: 一个例子 API component生命周期 备注1:仅模板式的component 备注2:component虚拟绑定 备注3:传递标记到component绑定 内存管理 一个例子 First instance, without parameters Second instance, passing parameters UI源码: <h4>First instance, without parameters</h4> <div data-bind='compon

KnockoutJS 3.X API 第四章 数据绑定(2) 控制流foreach绑定

foreach绑定 foreach绑定主要用于循环展示监控数组属性中的每一个元素,一般用于table标签中 假设你有一个监控属性数组,每当您添加,删除或重新排序数组项时,绑定将有效地更新UI的DOM-插入或去除相关项目或重新排序现有的DOM元素,不影响任何其他的DOM元素. 当然,也可以配合其他控制流一起适用,例如if和with. 示例1:遍历监控属性数组 本例适用foreach绑定,在一个table标签中循环显示监控属性数组的内容 <table> <thead> <tr&g

KnockoutJS 3.X API 第四章 数据绑定(3) 控制流if绑定和ifnot绑定

if绑定目的 if绑定一般是格式是data-bind=if:attribute,if后所跟属性或表达式的值应为bool值(也可以是非bool值,当非空字符串时则为真),if绑定的作用与visible绑定的作用类似.可控制DOM的显示与隐藏,不一样的地方是,if绑定是物理删除或添加DOM元素. 示例1 该例展示IF绑定的动态删除添加DOM: Display message Here is a message. Astonishing. UI源码: <label><input type=&q

KnockoutJS 3.X API 第四章 数据绑定(4) 控制流with绑定

with绑定的目的 使用with绑定的格式为data-bind="with:attribute",使用with绑定会将其后所跟的属性看作一个新的上下文进行绑定.with绑定内部的所有元素将受到该上下文的约束. 当然,with绑定也可配合if或foreach绑定一起使用. 示例1 <h1 data-bind="text: city"> </h1> <p data-bind="with: coords"> Lati

KnockoutJS 3.X API 第四章 表单绑定(10) textInput、hasFocus、checked绑定

textInput绑定目的 textInput绑定主要用于<input>或者<textarea>元素.他提供了DOM和viewmodel的双向更新.不同于value绑定,textinput绑定是实时更新的. 例如: Login name: Password: ViewModel: 源码: <p>Login name: <input data-bind="textInput: userName" /></p> <p>

KnockoutJS 3.X API 第五章 高级应用(5) 使用预处理扩展Knockout绑定语法

注意:这是一种高级技术,通常仅在创建可重用绑定或扩展语法的库时使用. 这不是你通常需要做的时候使用Knockout构建应用程序. 从Knockout 3.0开始,开发人员可以通过提供在绑定过程中重写DOM节点和绑定字符串的回调来定义自定义语法. 预处理绑定字符串 您可以通过为特定绑定处理程序(例如click,visible或任何自定义绑定处理程序)提供绑定预处理程序,来挂钩Knockout的逻辑来解释数据绑定属性. 为此,将预处理函数附加到绑定处理程序: ko.bindingHandlers.y

KnockoutJS 3.X API 第三章 计算监控属性(5) 参考手册

计算监控属性构造参考 计算监控属性可使用以下形式进行构造: ko.computed( evaluator [, targetObject, options] ) - 这种形式是创建一个计算监控属性最常见的情况. evaluator - 用于返回计算值的函数. targetObject-如果给出定义的值this时KO调用回调函数.参见部分第三章 计算监控属性(1) 使用计算监控属性以获取更多信息. options - 计算监控属性的其他属性的对象.请参见下面的完整列表. ko.computed(

KnockoutJS 3.X API 第三章 计算监控属性(3) KO如何实现依赖追踪

KO是如何实现自动更新的 初学者可以掠过该篇,如果你是一个刨根问底的开发者,那本节将告诉你KO是如何实现依赖追踪和UI自动更新的. 其实很简单,KO的依赖追踪算法如下: 当你声明一个计算监控属性,KO立即调用其相关的函数来获取其初始值. 当相关函数正在运行,KO将建立一个订阅到相关监控属性(包括其他计算监控属性)并读取他们的值.订阅回调函数设置为订阅函数再次运行,循环的这个过程. 当有新的值,KO会通知你的计算监控属性将值反馈给用户. 采用PEEK控制依赖 Knockout的自动依赖跟踪通常不是

KnockoutJS 3.X API 第六章 组件(2) 组件注册

要使Knockout能够加载和实例化组件,必须使用ko.components.register注册它们,从而提供如此处所述的配置. 注意:作为替代,可以实现一个自定义组件加载器(自定义加载器下一节介绍),通过自己的约定获取组件,而不是显式配置. 本节目录 将组件注册为viewmodel/template 指定视图模型 构造函数 共享对象实例 一个createViewModel工厂函数 一个AMD模块,其值描述一个viewmodel 指定模板 现有元素ID 现有元素实例 一串标记 DOM节点数组