• 在ASP.NET MVC中使用Knockout实践02,组合View Model成员、Select绑定、通过构造器创建View Model,扩展View Model方法


    本篇体验使用ko.computed(fn)计算、组合View Model成员、Select元素的绑定、使用构造器创建View Model、通过View Model的原型(Prototype)为View Model添加扩展方法。

     

    □ 使用ko.computed(fn)计算成员

     

    有时候,我们希望把View Model中的几个成员组合起来成为一个新成员,使用ko.computed(fn)可实现。

    接着上一篇,为productViewModel这个json对象增加一个计算成员。

    <div data-bind="text:formatted"></div> <hr/>
    
    <input type="text" data-bind="value:name"/>
    
    @section scripts
    
    {
    
        <script src="~/Scripts/knockout-2.2.0.js"></script>
    
        <script type="text/javascript">
    
            $(function() {
    
                
    
                $.getJSON('@Url.Action("GetFirstProduct","Home")', function (data) {
    
                    productViewModel.name(data.Name);
    
                    productViewModel.category(data.Category);
    
                });
    
            });
    
            var productViewModel = {
    
                id: ko.observable(""),
    
                name: ko.observable("初始值"),
    
                price: ko.observable(""),
    
                category: ko.observable("")
    
            };
    
            //为productViewModel增加一个计算成员
    
            productViewModel.formatted = ko.computed(function() {
    
                return productViewModel.name() + "--" + productViewModel.category();
    
            });
    
            //绑定
    
            ko.applyBindings(productViewModel);
    
        </script>
    

     

    以上,对于在View Model中的成员,如果已经被赋予observable后,必须通过类似name()的方式获取成员值。

     

    □ Select元素的绑定

     

    对于Select元素,它的options属性应该绑定一个数组,它的value属性绑定一个选中值。

    <select data-bind="options: categories, value: category" ></select><hr/>
    
    @section scripts
    
    {
    
        <script src="~/Scripts/knockout-2.2.0.js"></script>
    
        <script type="text/javascript">
    
            $(function() {
    
                
    
                $.getJSON('@Url.Action("GetFirstProduct","Home")', function (data) {
    
                    productViewModel.name(data.Name);
    
                    productViewModel.category(data.Category);
    
                });
    
            });
    
            var productViewModel = {
    
                id: ko.observable(""),
    
                name: ko.observable("初始值"),
    
                price: ko.observable(""),
    
                category: ko.observable(""),
    
                categories: ["小说","散文","传记"]
    
            };
    
            //为productViewModel增加一个计算成员
    
            productViewModel.formatted = ko.computed(function() {
    
                return productViewModel.name() + "--" + productViewModel.category();
    
            });
    
            //绑定
    
            ko.applyBindings(productViewModel);
    
        </script>
    
    }
    

    2

    □ 使用构造器创建View Model

     

    <select data-bind="options: categories, value: category" ></select><hr/>
    
    @section scripts
    
    {
    
        <script src="~/Scripts/knockout-2.2.0.js"></script>
    
        <script type="text/javascript">
    
            $(function() {
    
                
    
                $.getJSON('@Url.Action("GetFirstProduct","Home")', function (data) {
    
                    product.name(data.Name);
    
                    product.category (data.Category);
    
                });
    
            });
    
            var Product = function(name, category, categories) {
    
                this.name = ko.observable(name);
    
                this.category = ko.observable(category);
    
                this.categories = categories;
    
                this.formatted = ko.computed(function() {
    
                    return this.name() + "--" + this.category();
    
                }, this);
    
            };
    
            var product = new Product("默认值", "默认值", ["小说", "散文", "传记"]);
    
            //绑定
    
            ko.applyBindings(product);
    
        </script>
    
    }
    

    2

    □ 为View Model原型(Prototype)扩展方法

     

    以上,ko.computed中使用了一个匿名函数,如果把这个匿名函数作为Product的扩展方法,该如何做到呢?
    
    <select data-bind="options: categories, value: category" ></select><hr/>
    
    @section scripts
    
    {
    
        <script src="~/Scripts/knockout-2.2.0.js"></script>
    
        <script type="text/javascript">
    
            $(function() {
    
                
    
                $.getJSON('@Url.Action("GetFirstProduct","Home")', function (data) {
    
                    product.name(data.Name);
    
                    product.category (data.Category);
    
                });
    
            });
    
            var Product = function(name, category, categories) {
    
                this.name = ko.observable(name);
    
                this.category = ko.observable(category);
    
                this.categories = categories;
    
                this.formatted = ko.computed(this.getFormatted, this);
    
            };
    
            ko.utils.extend(Product.prototype, {
    
                getFormatted: function() {
    
                    return this.name() + "--" + this.category();
    
                }
    
            });
    
            var product = new Product("默认值", "默认值", ["小说", "散文", "传记"]);
    
            //绑定
    
            ko.applyBindings(product);
    
        </script>
    
    }
    

    以上,通过ko.utils.extend方法,为Product的原型添加了扩展方法getFormatted。

  • 相关阅读:
    Oracle中Blob转换成Clob
    【转】解决PowerDesigner 反向工程没有注释(备注)(SQL Server2008)+ Sql导入powerdesigner时中文丢失问题(Oracle11g)
    中国大陆开源镜像站汇(好东西大家一起用)
    【转】 CSS样式丢失总结
    .net程序错误:BadImageFormatException....如果在安装32位Oracle客户端组件的情况下以64位模式运行
    [转]程序员常用不常见很难得的地址大全,转来自己用
    【转】(C#)用MyXls生成Excel报表
    C# 生成Excel 并保存 包含web和winform调用方法
    ThinkPHP运算符与PHP运算符对照表
    ThinkPHP常用配置路径
  • 原文地址:https://www.cnblogs.com/darrenji/p/4067723.html
Copyright © 2020-2023  润新知