knockout示例

最近项目需要用到knockout js,有关knockout的介绍网上已经很多很多了,但是很少有比较全面的示例,于是乎我就自己做了一个小demo,已备以后查阅。knockout经常和knockout.mapping 和knockout.validation联合使用。运行效果如图:

实现了添加、删除、验证和保存功能。由于时间关系,我就直接贴代码了。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>ko mapping</title>
    <script type="text/javascript" src="js/jquery-2.1.1.js"></script>
    <script type="text/javascript" src="js/jquery-migrate-1.2.1.min.js"></script>
    <script type="text/javascript" src="js/json2.js"></script>
    <script type="text/javascript" src="js/knockout-min.js"></script>
    <script type="text/javascript" src="js/knockout.mapping-latest.js"></script>
    <script type="text/javascript" src="js/knockout.validation.js"></script>
</head>
<body>
    <div>

        <table data-bind="foreach: Data">
            <tr>
                <td>
                    <p>ID: <span data-bind="text:ID"></span></p>
                </td>
                <td>
                    <p>
                        Name:
                        <input type="text" data-bind="value:Name" />
                    </p>
                </td>
                <td>
                    <p>
                        Age:
                        <input type="text" data-bind="value:Age" />
                    </p>
                </td>
                <td>
                    <input type="button" value="Remove" data-bind="click:$root.remove" /></td>
            </tr>
        </table>
        <input type="button" value="Add" data-bind="click:Add" />
        <input type="button" value="submit" data-bind="click:save" />

    </div>
    <script type="text/javascript">
        $(function () {
            var applyValidators = function (vm) {
                var data = vm.Data();
                for (var i = 0; i < data.length; i++) {
                    applyValidatorsToPerson(data[i]);
                }
            }
            var applyValidatorsToPerson = function (p) {
                p.Name.extend({ required: { params: true, message: "请输入Name" } });
                p.Age.extend({
                    required: { params: true, message: "请输入Age" },
                    min: { params: 1, message: "请输入大于1的整数" },
                    max: { params: 100, message: "请输入小于100的整数" },
                });
            }
            var viewmodel = function () {
                self = this;
                self.Data = ko.observableArray()
                self.save = function () {
                    self.errors = ko.validation.group(self);
                    if (self.isValid()) {
                        var data = ko.mapping.toJS(self.Data);
                        data = JSON.stringify(data);
                        $.post("/komap.ashx", data, null, null);
                    } else {
                        self.errors.showAllMessages();
                    }

                }
                self.Add = function () {
                    var index = self.Data().length;
                    var id = self.Data()[index - 1].ID() + 1
                    var obj = {
                        ID: ko.observable(id),
                        Name: ko.observable("test"),
                        Age: ko.observable(30)
                    };
                    applyValidatorsToPerson(obj);
                    self.Data.push(obj);

                }
                self.remove = function (p) {
                    self.Data.remove(p);
                };
            }
            var vm, model;
            $.get("/komap.ashx", null, function (data) {
                var jd = JSON.parse(data);
                vm = ko.mapping.fromJS(jd);
                model = new viewmodel();
                $.extend(model, vm, true);
                applyValidators(model);
                ko.applyBindings(model);

            }, null);

        });

    </script>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Newtonsoft.Json;
using System.IO;
namespace WebApp
{
    /// <summary>
    /// Summary description for komap
    /// </summary>
    public class komap : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            string methodName = context.Request.RequestType;
            Datainfo data = new Datainfo(); ;
            if (methodName.Equals("POST"))
            {
                string str = string.Empty;
                using (StreamReader sr = new StreamReader(context.Request.InputStream))
                {
                    str = sr.ReadToEnd();
                    str = context.Server.UrlDecode(str);
                }

                Datainfo info = new Datainfo { Data = JsonConvert.DeserializeObject<List<UserInfo>>(str) };
                if (info != null)
                    context.Cache["komap"] = info;
            }
            else
            {
                data = GetData();
            }

            string ret = JsonConvert.SerializeObject(data);
            context.Response.Write(ret);
        }

        private static Datainfo GetData()
        {
            object obj = HttpContext.Current.Cache.Get("komap");
            if (obj == null || (obj as Datainfo).Data.Count<1)
            {
                UserInfo info = new UserInfo { ID = 1, Name = "gavin ma", Age = 30 };
                UserInfo info2 = new UserInfo { ID = 2, Name = "lor liu", Age = 31 };
                UserInfo info3 = new UserInfo { ID = 3, Name = "mark ma", Age = 29 };
                List<UserInfo> list = new List<UserInfo>();
                list.Add(info);
                list.Add(info2);
                list.Add(info3);
                Datainfo data = new Datainfo { Data = list };
                obj = data;
                HttpContext.Current.Cache.Insert("komap", obj);

            }
            return obj as Datainfo;
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
    public class UserInfo
    {
        public int ID { set; get; }
        public string Name { set; get; }
        public int Age { set; get; }
    }
    public class Datainfo
    {
        public List<UserInfo> Data { set; get; }
    }
}

代码非常简单。大家可以在http://download.csdn.net/detail/dz45693/8728239 这里下载有关knockout的简单示例

时间: 2024-10-14 18:21:59

knockout示例的相关文章

Knockout JS 入门示例

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="MyWeb.WebForm1" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="s

Singal Page App:使用Knockout和RequireJS创建高度模块化的单页应用引擎

开篇扯淡 距离上一篇文章已经有好几个月,也不是没有时间记录点东西,主要是换了新的工作,在一家外资工作,目前的工作内容大多都是前端开发,新接触的东西因为时间原因,大多还不成体系,所以这么长时间什么都没记录下来,也正是因为新的工作内容,才有了今天这篇文章. 这篇文章是我自己的博客项目的前端重写,因为目前ASP.NET API和单页应用的流行,结合目前工作中用到的东西,我决定把我的博客项目的前端部分整个重写,(以前的就是一坨-) 步入正题 背景知识 RequireJS http://www.requi

Knockout学习笔记(三)

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

MVC、MVP、MVVM、Angular.js、Knockout.js、Backbone.js、React.js、Ember.js、Avalon.js 概念摘录

转自:http://www.cnblogs.com/xishuai/p/mvc-mvp-mvvm-angularjs-knockoutjs-backbonejs-reactjs-emberjs-avalonjs.html MVC MVC(Model-View-Controller),M 是指业务模型,V 是指用户界面,C 则是控制器,使用 MVC 的目的是将 M 和 V 的实现代码分离,从而使同一个程序可以使用不同的表现形式. 交互方式(所有通信都是单向的): View 传送指令到 Contro

基于Bootstrap和Knockout.js的ASP.NET MVC开发实战

之前在一家公司里用过Knockout,是easyui 和 Knockout结合 的.下面的这本应该不错. 目录 前言 第一部分入门指南 第1章MVC介绍 创建第一个项目 分析HomeController 分析View 理解URL结构 小结 第2章Bootstrap介绍 默认菜单 含有下拉列表和搜索框的菜单 按钮 警告框 主题 小结 第3章Knockout.js介绍 安装Knockout.js 基本示例 何为MVVM? 创建ViewModel 小结 第4章数据库应用 Entity Framewor

Knockout.Js官网学习(value绑定)

前言 value绑定是关联DOM元素的值到view model的属性上.主要是用在表单控件<input>,<select>和<textarea>上. 当用户编辑表单控件的时候, view model对应的属性值会自动更新.同样,当你更新view model属性的时候,相对应的元素值在页面上也会自动更新. 注:如果你在checkbox或者radio button上使用checked绑定来读取或者写入元素的 checked状态,而不是value 值的绑定. 简单示例 代码如

4.Knockout.Js官网学习(事件绑定)

前言 click绑定在DOM元素上添加事件句柄以便元素被点击的时候执行定义的JavaScript 函数.大部分是用在button,input和连接a上,但是可以在任意元素上使用. 简单示例 <h2>ClickBind</h2> <div> You've clicked <span data-bind="text: numberOfClicks"></span> times <button data-bind="

【ASP.NET Web API教程】2.3.5 用Knockout.js创建动态UI

注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. Part 5: Creating a Dynamic UI with Knockout.js 第5部分:用Knockout.js创建动态UI 本文引自:http://www.asp.net/web-api/overview/creating-web-apis/using-web-api-with-entity-framework/using-web-api-with-entity-fra

3.Knockout.Js官网学习(visible绑定)

前言 让visible绑定到DOM元素上,使得该元素的hidden或visible取决于绑定的值. 简单的绑定 首先还是先定义一个ViewModel var AppViewModel = { shouldShowMessage: ko.observable(true) ///初始化的时候div是visible的 }; AppViewModel.shouldShowMessage = ko.observable(false); ///现在hidden勒 ko.applyBindings( AppV