Knockout学习之(2)

组合监控属性


顾名思义,就是我们可以将多个属性合并为一个属性。这样在显示的时候就是整体了,并且其中任何一个属性发生改变,这个属性也都会随之发生改变从而更新视图,而这些只需要使用computed函数就可以实现,比如下面的代码我们将firstName和lastName合并为fullName属性,并呈现:


 1 <span data-bind="text: fullName" />
2
3 <script type="text/javascript">
4 function AppViewModel() {
5 this.firstName = ko.observable("Bob");
6 this.lastName = ko.observable("Smith");
7 this.fullName = ko.computed(function () {
8 return this.firstName() + " " + this.lastName();
9 }, this);
10 };
11
12 ko.applyBindings(new AppViewModel());
13 </script>

这里我们通过传递一个函数给computed,并且该函数仅仅返回由firstName和lastName组成的完整姓名,这样我们就轻松的将两个属性组合了。其中computed的第二个参数传递的是this,主要是用来指定第一个参数的环境上下文。

上面仅仅只能用于显示,如果我们还要修改这个组合属性,那么就需要将上面的写法给写成如下的方式:


 1 <span data-bind="text: firstName"></span>
2 <span data-bind="text: lastName"></span>
3 <input type="text" data-bind="value: fullName" />
4
5 <script type="text/javascript">
6 function AppViewModel() {
7 this.firstName = ko.observable("Bob");
8 this.lastName = ko.observable("Smith");
9 this.fullName = ko.computed({
10 read: function () {
11 return this.firstName() + " " + this.lastName();
12 },
13 write: function (value) {
14 var lastSpecPos = value.lastIndexOf(" ");
15 if (lastSpecPos > 0) {
16 this.firstName(value.substring(0, lastSpecPos));
17 this.lastName(value.substring(lastSpecPos + 1));
18 }
19 },
20 owner: this
21 });
22 };
23
24 ko.applyBindings(new AppViewModel());
25 </script>

我们将传递给computed的参数改成了一个对象,并且写了read、write、owner属性,其中read用来读取该组合属性,而write用来赋值,所以该函数会有一个value参数,最后的owner跟computed的第二个参数是一样的,主要用来指定read和write函数执行的上下文环境。读者这个时候可以随意的修改文本中的值,会发现前面的值也会跟着变动,这些都是ko带给我们的快捷。


 1 <span data-bind="text: firstName"></span>
2 <span data-bind="text: lastName"></span>
3 <input type="text" data-bind="value: fullName" />
4 <span data-bind="visible:isEdit">你改动过了</span>
5
6 <script type="text/javascript">
7 function AppViewModel() {
8 this.firstName = ko.observable("Bob");
9 this.lastName = ko.observable("Smith");
10 this.isEdit = ko.observable(false);
11 this.fullName = ko.computed({
12 read: function () {
13 return this.firstName() + " " + this.lastName();
14 },
15 write: function (value) {
16 var lastSpecPos = value.lastIndexOf(" ");
17 if (lastSpecPos > 0) {
18 this.firstName(value.substring(0, lastSpecPos));
19 this.lastName(value.substring(lastSpecPos + 1));
20 this.isEdit(true);
21 }
22 },
23 owner: this
24 });
25 };
26
27 ko.applyBindings(new AppViewModel());
28 </script>

当然组合属性也不一定非要由多个属性组合,我们也可以将多个属性作为参数,然后通过ajax传递到服务端,从而获取属性值然后显示,比如jquery中的$.getJSON方法。

Knockout学习之(2),布布扣,bubuko.com

时间: 2024-10-13 10:38:55

Knockout学习之(2)的相关文章

Knockout学习笔记(三)

之前的文章主要针对的是单一的observable(即便是observableArray也是一种observable),而文档Using computed observables则主要是针对ko.computed这一function,它能够将多个observable联系起来,无论这些observable中的哪个发生了变化,ko.computed也会发生相应的变化并将结果反应在UI中. 首先,创建一个view model如下: 1 function MyViewModel() { 2 this.fi

Knockout学习之(1)

监控属性 Knockout包含以下三个核心特性: 1.监控属性和依赖跟踪 2.显式绑定 3.模板 下面我们将学习这三点中的第一点,在这之前我们先研究下MVVM模式和视图模型的概念. MVVM和视图模型 模型:用来存储应用中的数据.它处于业务领域中,并且包含了相关的属性以及操作,与用户界面独立.在使用OK时,你将经常使用ajax保持该模型与服务端同步. 视图模型:使用纯代码表示界面的数据和操作.比如,你要实现一个列表编辑功能,那么你的视图模型就需要维持一组数据项,同时还要提供添加和删除方法. 视图

Knockout学习笔记(二)

这篇文章主要用于记录学习Working with observable arrays的测试和体会. Observable主要用于单一个体的修改订阅,当我们在处理一堆个体时,当UI需要重复显示一些样式相同的元素时,这些数据的绑定就需要依靠observable arrays. 特别需要注意的一点是,observable arrays关注的是数组中元素整体的变化(包括增加元素,删减元素,元素顺序的改变等等),而不是元素个体的变化(元素内部某些部分的改变). 我们可以在js文件中创建一个observab

Knockout学习之表单绑定器(上)

表单绑定器 “click”绑定 Click 绑定器可以将javascript函数绑定到指定的dom元素,并且再该元素被点击时将触发绑定的函数,大多数情况下都会使用button.input和a元素,当然其他可见的dom元素也是一样可以的.下面我们就简单的举一个例子: 1 <div> 2 你已经点击了<span data-bind="text:numberOfClicks" ></span> 3 <button data-bind="cl

Knockout学习之表单绑定器(下)

“hasFocus”绑定 hasFocus绑定器会将DOM元素的焦点状态与视图模型中的属性相关联,当你设置视图模型中关联的属性为true或false后,将能够设置关键的DOM元素是否获得焦点. 比如下面的例子将会演示如何使用通过代码设置焦点,并且当关联的标签获得焦点后显示一段文本: 1 <div> 2 <input type="text" data-bind="hasfocus: focusState" /> 3 <button typ

Knockout学习笔记(四)

由于Writable computed observables和How dependency tracking works的要求相对较高,我先跳过这两篇,学习Pure computed observables. Pure computed observables相对于一般的computed observables,在性能和存储上有优势,这是因为pure computed observables在不存在订阅者的时候是不会保持订阅关系的.这也使得pure computed observables有如

Knockout学习之文本和外观绑定器

文本和外观绑定器 “visible”绑定 该绑定主要用来让我们通过监控属性可以控制html文档的显示,只要绑定的监控属性为false.0.null或者undefined则隐藏该标签,否则显示.比如下面的示例: 1 <span data-bind="visible:visibleState">显示了</span> 2 <div> 3 <button type="button" data-bind="click:sho

knockout学习资料

一个靠谱的哥们整理的Knockout学习资料 Knockout学习之监控属性 Knockout学习之组合监控属性 Knockout学习之监控数组 Knockout学习之文本和外观绑定器 Knockout学习之控制流绑定器 Knockout学习之表单绑定器(上) Knockout学习之表单绑定器(下) Knockout学习之模板绑定器

Knockout学习之控制流绑定器

控制流绑定器 “foreach”绑定 顾名思义,通过该绑定我们就可以将监控数组循环输出到页面中去了,当然我们还是先来段简单的示例,仅仅只是输出监控数组: 1 <ul data-bind="foreach:people" > 2 <li data-bind="text:Name"></li> 3 </ul> 4 5 6 <script type="text/javascript"> 7 8