码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-03-31 16:25:38      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:

如果你已经有了一个监控属性 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>

 

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

标签:

原文地址:http://www.cnblogs.com/jsncz/p/5341368.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!