前面已经介绍了ko的基本用法,结合官方文档,基本就可以实际应用了。本章作为ko学习的最后一篇,实现一个简单的demo。主要集中在ko,所以后台数据都是静态的。类似于博园,有一个个人文章的分类列表,一个文章列表。可以在文章最后下载工程源代码(包括之前demo的代码)。实现效果图如下:

一、准备数据

  分类信息Kind:

    public class Kind
{
public string Url { get; set; }
public string Name { get; set; }
public int Count { get; set; }
}

  文章信息Essay:

    public class Essay
{
public string Url { get; set; }
public string Name { get; set; }
public short Status { get; set; }
public int Comment { get; set; }
public int PageView { get; set; }
public int RssView { get; set; }
public string Date { get; set; }
}

二、准备模板

  主要html:

<div id="container">
<div id="head">博客园</div>
<div id="content">
<div id="kindField">
<div id="kindHeader">分 类</div>
<ul id="kindList" data-bind="template:{name:'kindTmpl',foreach:kindList}"></ul>
</div>
<div id="essayField">
<div id="essayHeader">随笔</div>
<table id="essayList" cellpadding="0" cellspacing="0">
<thead>
<tr>
<td>标题</td><td class="w40 tc">发布<br />状态</td><td class="w40 tc">评论</td><td class="w40 tc">页面<br />浏览</td><td class="w40 tc">RSS<br />阅读</td><td class="w40 tc">操作</td><td class="w40 tc">操作</td>
</tr>
</thead>
<tbody data-bind="template:{name:'essayTmpl',foreach:essayList}"></tbody>
</table>
</div>
</div>
</div>

  分类模板和文章模板:

<script type="text/tmpl" id="kindTmpl">
<li><a data-bind="attr:{href:Url}"><span data-bind="text:Name"></span>(<span data-bind="text:Count"></span>)</a></li>
</script>
<script type="text/tmpl" id="essayTmpl">
<tr>
<td>
<a data-bind="attr:{href:Url,title:Name}">
<span data-bind="text:Name"></span>(<span data-bind="text:Date"></span>) <span data-bind="ifnot:Status">[草稿箱]</span>
</a>
</td>
<td class="tc" data-bind="text:$parent.getStatus($data.Status)"></td>
<td class="tc" data-bind="text:Comment"></td>
<td class="tc" data-bind="text:PageView"></td>
<td class="tc" data-bind="text:RssView"></td>
<td class="tc"><a class="action" data-bind="click:$parent.edit">编辑</a></td>
<td class="tc"><a class="action" data-bind="click:function(){$parent.del($element);}">删除</a></td>
</tr>
</script>

三、数据绑定

  前台定义model和viewmodel,然后通过ajax获取数据,完成绑定。

    function Kind(){
this.Url = "";
this.Name = "";
this.Count = "";
this.getKind = function(){
$.getJSON("../Handlers/GetKind.ashx",function(data){
kindVM.kindList(data);
})
}
}
function KindList(){
this.kindList = ko.observable([]);
}
function Essay(){
this.Url = "";
this.Name = "";
this.Status = 0;
this.Comment = 0;
this.PageView = 0;
this.RssView = 0;
this.Date = "";
this.getEssay = function(){
$.getJSON("../Handlers/GetEssay.ashx",function(data){
essayVM.essayList(data);
})
}
}
function EssayList(){
this.essayList = ko.observableArray([]);
this.edit = function(essay){
alert("编辑:" + essay.Url);
}
this.del = function(dom){
var jTr = $(dom).parents("tr");
jTr.replaceWith("<tr><td style='color:red;border:none;'>删除成功!</td></tr>");
}
this.getStatus = function(status){
if(status === 0){
return "未发布";
}
return "发布";
}
}
var kind = new Kind();
var kindVM = new KindList();
var essay = new Essay();
var essayVM = new EssayList();
ko.applyBindings(kindVM,document.getElementById("kindField"));
ko.applyBindings(essayVM,document.getElementById("essayField"));
kind.getKind();
essay.getEssay();

源码下载

knockout学习笔记10:demo的更多相关文章

  1. knockout学习笔记目录

    关于knockout学习系列的文章已经写完,这里主要是做个总结,并且将目录罗列出来,方便查看.欢迎各位大神拍砖和讨论. 总结 kncokout是一个轻量级的UI类库,通过MVVM模式使前端的UI简单话 ...

  2. 并发编程学习笔记(10)----并发工具类CyclicBarrier、Semaphore和Exchanger类的使用和原理

    在jdk中,为并发编程提供了CyclicBarrier(栅栏),CountDownLatch(闭锁),Semaphore(信号量),Exchanger(数据交换)等工具类,我们在前面的学习中已经学习并 ...

  3. thinkphp学习笔记10—看不懂的路由规则

    原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...

  4. 《C++ Primer Plus》学习笔记10

    <C++ Primer Plus>学习笔记10 <<<<<<<<<<<<<<<<<&l ...

  5. SQL反模式学习笔记10 取整错误

    目标:使用小数取代整数 反模式:使用Float类型 根据IEEE754标识,float类型使用二进制格式编码实数数据. 缺点:(1)舍入的必要性: 并不是所有的十进制中描述的信息都能使用二进制存储,处 ...

  6. golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息

    golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...

  7. Spring MVC 学习笔记10 —— 实现简单的用户管理(4.3)用户登录显示全局异常信息

    </pre>Spring MVC 学习笔记10 -- 实现简单的用户管理(4.3)用户登录--显示全局异常信息<p></p><p></p>& ...

  8. Hadoop学习笔记(10) ——搭建源码学习环境

    Hadoop学习笔记(10) ——搭建源码学习环境 上一章中,我们对整个hadoop的目录及源码目录有了一个初步的了解,接下来计划深入学习一下这头神象作品了.但是看代码用什么,难不成gedit?,单步 ...

  9. APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause

    转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int k ...

随机推荐

  1. 使用CoreProfiler/NanoProfiler实现跨平台&应用的整合性能调试

    摘要 NanoProfiler是一个开源.NET性能调试类库,CoreProfiler是其.NET Core版本的实现.在之前的一些文章中,我曾介绍过NanoProfiler的主要使用方式,以及如何为 ...

  2. logstash日志分析的配置和使用

    logstash是一个数据分析软件,主要目的是分析log日志.整一套软件可以当作一个MVC模型,logstash是controller层,Elasticsearch是一个model层,kibana是v ...

  3. Rafy 框架-发布网页版用户手册

    前段时间把 Rafy 的用户手册由 CHM 格式转换为了网页格式,而且发布到了 github.io 上,即方便文档的实时更新,也方便大家查看. Rafy 用户手册网页版地址: http://zgynh ...

  4. QML 从无到有 (基础)

    小公司,没办法,什么都得自己亲自来. 服务端是MVC,现在需要可PC客户端和移动APP. 考虑到网页应用有很多界面框架,可以做出很漂亮的界面来,就尝试着使用nwjs来实现,可是在使用了2天的nwjs后 ...

  5. PHP基础知识第三趴

    今天如约放送函数部分吧,毕竟预告都出了,"广电"也没禁我......

  6. Quartz —— 从 HelloWorld 开始

    1.Quartz 是用来完成任务调度的. 2.Quartz 的三个核心概念:调度器.任务.触发器. (1)Job:通过实现该接口来定义需要执行的任务. public interface Job { / ...

  7. 解决mysql too many connections的问题

    由于公司服务器上的创建的项目太多,随之创建的数据库不断地增加,在用navicat链接某一个项目的数据库时会出现too many connections ,从而导致项目连接数据库异常,致使启动失败. 为 ...

  8. Qt——组件位置随窗口变化

    当我们用Qt Designer设计界面时,有时会面临这样一个问题:需要在窗口指定位置放置组件,并且当窗口位置大小改变时,该组件相对其父对象的位置是不变的,如下面两幅图所示 ,首先看上面这幅图,注意bu ...

  9. datatables中的Options总结(2)

    datatables中的Options总结(2) 五.datatable,列 columnDefs.targets 分配一个或多个列的列定义. columnDefs 设置列定义初始化属性. colum ...

  10. html中role的作用

    role 是增强语义性,当现有的HTML标签不能充分表达语义性的时候,就可以借助role来说明. 通常这种情况出现在一些自定义的组件上,这样可增强组件的可访问性.可用性和可交互性. role的作用是描 ...