最近项目需要用到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 = ; 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: , message: "请输入大于1的整数" },
max: { params: , 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 - ].ID() +
var obj = {
ID: ko.observable(id),
Name: ko.observable("test"),
Age: ko.observable()
};
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<)
{
UserInfo info = new UserInfo { ID = , Name = "gavin ma", Age = };
UserInfo info2 = new UserInfo { ID = , Name = "lor liu", Age = };
UserInfo info3 = new UserInfo { ID = , Name = "mark ma", Age = };
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的简单示例

knockout示例的更多相关文章

  1. Knockout示例:User数据CRUD

    模拟数据user.json. { "page": 0, "rows": 0, "total": 161, "isSuccess&q ...

  2. KnockOut.js入门示例详解

    KnockOut框架简称KO,是微软将应用于WPF/Silverlight的MVVM模式在Web上的尝试,这是一个非常有用的JavaScript框架. KO的核心就是绑定,包括数据绑定和行为绑定: K ...

  3. knockout.js模板绑定之利用Underscore.js模板引擎示例

    View代码 <h1>People</h1> <ul data-bind="template: { name: 'peopleList' }"> ...

  4. Knockout JS 入门示例

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx. ...

  5. MVVM大比拼之knockout.js源码精析

    简介 本文主要对源码和内部机制做较深如的分析,基础部分请参阅官网文档. knockout.js (以下简称 ko )是最早将 MVVM 引入到前端的重要功臣之一.目前版本已更新到 3 .相比同类主要有 ...

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

    注:文章内容都是摘录性文字,自己阅读的一些笔记,方便日后查看. MVC MVC(Model-View-Controller),M 是指业务模型,V 是指用户界面,C 则是控制器,使用 MVC 的目的是 ...

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

    前言 value绑定是关联DOM元素的值到view model的属性上.主要是用在表单控件<input>,<select>和<textarea>上. 当用户编辑表单 ...

  8. KnockoutJS 3.X API 第五章 高级应用(5) 使用预处理扩展Knockout绑定语法

    注意:这是一种高级技术,通常仅在创建可重用绑定或扩展语法的库时使用. 这不是你通常需要做的时候使用Knockout构建应用程序. 从Knockout 3.0开始,开发人员可以通过提供在绑定过程中重写D ...

  9. Knockout.Js案例一Introduction

    </strong></p> <p>Last name: <strong data-bind="text:lastName ">tod ...

随机推荐

  1. C# listbox DataSource数据绑定--一年半以前的bug

    listbox使用DataSource进行数据绑定和删除,大家肯定都会, 写这个随笔只是因为....这是一年半以前刚进公司的我遗留的bug,现在看看当时竟然没有解决 - - 现在写个测试程序,写个随笔 ...

  2. ARP欺骗防御工具arpon

    ARP欺骗防御工具arpon   ARP欺骗是局域网最为常见的中人间攻击实施方式.Kali Linux提供一款专用防御工具arpon.该工具提供三种防御方式,如静态ARP防御SARPI.动态ARP防御 ...

  3. WEP/WPA-PSK密码破解工具aircrack-ng

    WEP/WPA-PSK密码破解工具aircrack-ng   aircrack-ng是Aircrack-ng工具集中的一个工具.该工具主要用于根据已经抓取的.cap文件或者.ivs文件破解出WEP/W ...

  4. BEM

    BEM代表块(Block),元素(Element),修饰符(Modifier).BEM是由Yandex团队提出的一种CSS Class 命名方法,旨在更好的创建CSS/Sass模块.通过增加前缀的办法 ...

  5. opesntack 底层共享存储 迁移配置

    底层共享存储在迁移配置: 每台compute 节点都需要配置一下 让nova用户可以登陆 usermod -s /bin/bash nova 设置nova 用户密码 echo "nova&q ...

  6. 【LCA】BZOJ1776-[Usaco2010 Hol]cowpol 奶牛政坛

    [题目大意] 一棵n个点的树,树上每个点属于一个党派,要求每个党派的最远距离点.两点间距离为两点间边的个数. [思路] yy一下可知,最远距离点中必有一个是该党派深度最深的一个,那么我们就记下最深的点 ...

  7. 【10.31校内测试】【组合数学】【记忆化搜索/DP】【多起点多终点二进制拆位Spfa】

    Solution 注意取模!!! Code #include<bits/stdc++.h> #define mod 1000000007 #define LL long long usin ...

  8. 7、Redis中对ZSet类型的操作命令

    写在前面的话:读书破万卷,编码如有神 --------------------------------------------------------------------   ---------- ...

  9. Codeforces Round #370 (Div. 2) B. Memory and Trident 水题

    B. Memory and Trident 题目连接: http://codeforces.com/contest/712/problem/B Description Memory is perfor ...

  10. MikroTik RouterOS电子克隆盘原理收集

    终于搞定RouteROS8位电子盘克隆,发个讯息出来分享一下. 不需要付费的免费分享,也没要刻意挡人财路:只是让信息流通一下. 也请看到的人不要用这个方式去赚钱,不然MikroTik还是会再反制的. ...