Knockout学习笔记(二)--使用计算属性

如果你已经有了一个监控属性 firstName和lastName,如果你想显示全名该怎么做呢?这个时候你就可以通过计算属性来实现,这个方法依赖于一个或多个监控属性,如果任何依赖对象发生改变他们就会跟着改变。

例如,下面的 view model:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js"></script>
    <script type="text/javascript" src="jslib/jquery.tmpl.min.js"></script>
    <script type="text/javascript" src="jslib/knockout-2.2.0.js"></script>
    <script type="text/javascript">
        $(document).ready(document_ready);
        function document_ready() {
            var self = this;
            //创建View-Model
            function AppViewModel(){
                this.firstName = ko.observable("xiao");
                this.lastName = ko.observable("ming");

                this.fullName = ko.computed(function(){
                    return this.firstName() + " " + this.lastName();
                }, this);
            }
            //ko绑定View-Model对象
            ko.applyBindings(new AppViewModel());
        }
    </script>
</head>
<body>
<p>First name: <strong data-bind="text: firstName"></strong></p>
<p>Last name: <strong data-bind="text: lastName"></strong></p>
<p>Full name: <strong data-bind="text: fullName"></strong></p>
</body>
</html>

可写的计算属性

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js"></script>
    <script type="text/javascript" src="jslib/jquery.tmpl.min.js"></script>
    <script type="text/javascript" src="jslib/knockout-2.2.0.js"></script>
    <script type="text/javascript">
        $(document).ready(document_ready);
        function document_ready() {
            function AppViewModel() {
                this.firstName = ko.observable(‘‘);
                this.lastName = ko.observable(‘‘);
                this.fullName = ko.computed({
                    read: function () {
                        return this.firstName() + " " + this.lastName();
                    },
                    write: function (value) {
                        var lastSpacePos = value.lastIndexOf(" ");
                        if (lastSpacePos > 0) {
                            this.firstName(value.substring(0, lastSpacePos));
                            this.lastName(value.substring(lastSpacePos + 1));
                        }
                    },
                    owner: this
                });
            }
            //ko绑定View-Model对象
            var appViewModel = new AppViewModel();
            ko.applyBindings(appViewModel);
            start();

            function start(){
                var idx = 0;
                var names = ["zhang san", "li si", "wang ermazi", "xiao taoqi"];
                setInterval(function(){
                    appViewModel.fullName(names[idx++%names.length]);
                    console.log(appViewModel.fullName());
                }, 1000);
            }
        }
    </script>
</head>
<body>
<p>First name: <strong data-bind="text: firstName"></strong></p>
<p>Last name: <strong data-bind="text: lastName"></strong></p>
<p>Full name: <strong data-bind="text: fullName"></strong></p>
</body>
</html>

值转换

有时你可能需要对底层存储的一个数据进行简单的转换之后显示给用户。例如:你可能需要存储浮点值来表示价格,但想让用户价格单位符号和固定的小数数位都一样。你可以使用一个可写的计算属性来完成价格转换,用户传入一个浮点型值自动映射成想要的格式。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js"></script>
    <script type="text/javascript" src="jslib/jquery.tmpl.min.js"></script>
    <script type="text/javascript" src="jslib/knockout-2.2.0.js"></script>
    <script type="text/javascript">
        $(document).ready(document_ready);
        function document_ready() {
            function AppViewModel() {
                this.price = ko.observable(25.99);
                this.formattedPrice = ko.computed({
                    read: function () {
                        return ‘$‘ + this.price().toFixed(2);
                    },
                    write: function (value) {
                        value = parseFloat(value.replace(/[^\.\d]/g, ""));
                        this.price(isNaN(value) ? 0 : value);
                    },
                    owner: this
                });
            }
            //ko绑定View-Model对象
            ko.applyBindings(new AppViewModel());
        }
    </script>
</head>
<body>
<p>Enter bid price: <input data-bind="value: formattedPrice"/></p>
</body>
</html>

筛选和验证用户输入 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js"></script>
    <script type="text/javascript" src="jslib/jquery.tmpl.min.js"></script>
    <script type="text/javascript" src="jslib/knockout-2.2.0.js"></script>
    <script type="text/javascript">
        $(document).ready(document_ready);
        function document_ready() {
            function AppViewModel() {
                this.acceptedNumericValue = ko.observable(123);
                this.lastInputWasValid = ko.observable(true);
                this.attemptedValue = ko.computed({
                    read: this.acceptedNumericValue,
                    write: function (value) {
                        if (isNaN(value))
                            this.lastInputWasValid(false);
                        else {
                            this.lastInputWasValid(true);
                            this.acceptedNumericValue(value);
                        }
                    },
                    owner: this
                });
            }
            //ko绑定View-Model对象
            ko.applyBindings(new AppViewModel());
        }
    </script>
</head>
<body>
<p>Enter a numeric value: <input data-bind="value: attemptedValue"/></p>
<div data-bind="visible: !lastInputWasValid()">That‘s not a number!</div>
</body>
</html>
时间: 2024-11-05 21:40:49

Knockout学习笔记(二)--使用计算属性的相关文章

Knockout学习笔记(二)

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

.Knockout学习笔记(五)

作为一名初学者来说,一篇篇的按顺序看官网上的文档的确是一件很痛苦的事情,毕竟它的排列也并非是由浅及深的排列,其中的顺序也颇耐人寻味,于是这篇文章我又跳过了Reference部分,进而进入到具体的bindings环节,首先接触到的是Controlling text and appearance. Visible binding会依据绑定的数据来决定相应的DOM元素是否隐藏. 我们首先在js文件部分定义一个view model,这里我创建的是一个object而不是一个构造函数,个人分析认为,obje

Knockout学习笔记(三)

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

Android学习笔记二十九之SwipeRefreshLayout、RecyclerView和CardView

Android学习笔记二十九之SwipeRefreshLayout.RecyclerView和CardView 前面我们介绍了AlertDialog和几个常用的Dialog,ProgressDialog进度条提示框.DatePickerDialog日期选择对话框和TimePickerDialog时间选择对话框.这一节我们介绍几个新的API控件SwipeRefreshLayout.RecyclerView和CardView,这几个API控件都是google在Android5.0推出的.下面我们来学

【Unity 3D】学习笔记二十六:unity游戏脚本(六)

在3D游戏世界中,任何一个游戏对象在创建的时候都会附带Transform(变换)组件,并且该组件是无法删除的,也不应该删除.在unity中,Transform面板一共有3个属性: Position  (位置) Rotation(旋转) Scale(缩放) 这三个值都是用来调整游戏对象在游戏界面中的位置,状态等相关参数. Position  (位置) 任何一个游戏对象的三维坐标都保存在Vector3容器中,该容器记录对象在X轴,Y轴,Z轴的坐标.一旦Vector33容器中的坐标发生变化,那么Sce

Android学习笔记二十四之ListView列表视图二

Android学习笔记二十四之ListView列表视图二 前面一篇我们介绍了常用的几种适配器的简单实现和ListView的简单使用,这一篇中,我们介绍一下ListView的优化和一些其它的问题. ListView优化方法一 在ListView中,我们最常用的就是自定义Adapter,在我们自定义Adapter中,需要实现两个比较重要的方法getCount()和getView(),前者是负责计算ListView的总Item数,后者是生成Item,有多少个Item就会调用getView()方法多少次

Knockout学习笔记(四)

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

Caliburn.Micro学习笔记(二)----Actions

Caliburn.Micro学习笔记(二)----Actions 上一篇已经简单说了一下引导类和简单的控件绑定 我的上一个例子里的button自动匹配到ViewModel事件你一定感觉很好玩吧 今天说一下它的Actions,看一下Caliburn.Micro给我们提供了多强大的支持 我们还是从做例子开始 demo的源码下载在文章的最后 例子1.无参数方法调用 点击button把textBox输入的文本弹出来 如果textbox里没有文本button不可点,看一下效果图 看一下前台代码 <Stac

小猪的数据结构学习笔记(二)

小猪的数据结构学习笔记(二) 线性表中的顺序表 本节引言: 在上个章节中,我们对数据结构与算法的相关概念进行了了解,知道数据结构的 逻辑结构与物理结构的区别,算法的特性以及设计要求;还学了如何去衡量一个算法 的好坏,以及时间复杂度的计算!在本节中我们将接触第一个数据结构--线性表; 而线性表有两种表现形式,分别是顺序表和链表;学好这一章很重要,是学习后面的基石; 这一节我们会重点学习下顺序表,在这里给大家一个忠告,学编程切忌眼高手低,看懂不代表自己 写得出来,给出的实现代码,自己要理解思路,自己

JavaScript--基于对象的脚本语言学习笔记(二)

第二部分:DOM编程 1.文档象模型(DOM)提供了访问结构化文档的一种方式,很多语言自己的DOM解析器. DOM解析器就是完成结构化文档和DOM树之间的转换关系. DOM解析器解析结构化文档:将磁盘上的结构化文档转换成内存中的DOM树 从DOM树输出结构化文档:将内存中的DOM树转换成磁盘上的结构化文档 2.DOM模型扩展了HTML元素,为几乎所有的HTML元素都新增了innerHTML属性,该属性代表该元素的"内容",即返回的某个元素的开始标签.结束标签之间的字符串内容(不包含其它