knockout学习笔记10:demo

  前面已经介绍了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();

源码下载

时间: 2024-10-28 03:59:36

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

学习笔记10

今天来粗略的学习一下js<script></script> JavaScript:写入 HTML 输出     document.write("<h1>This is a heading</h1>"); JavaScript:对事件作出反应       <button type="button" onclick="alert('Welcome!')">点击这里</button>

.Knockout学习笔记(五)

作为一名初学者来说,一篇篇的按顺序看官网上的文档的确是一件很痛苦的事情,毕竟它的排列也并非是由浅及深的排列,其中的顺序也颇耐人寻味,于是这篇文章我又跳过了Reference部分,进而进入到具体的bindings环节,首先接触到的是Controlling text and appearance. Visible binding会依据绑定的数据来决定相应的DOM元素是否隐藏. 我们首先在js文件部分定义一个view model,这里我创建的是一个object而不是一个构造函数,个人分析认为,obje

jQuery学习笔记10:Ajax技术

jQuery 库拥有完整的 Ajax 兼容套件.其中的函数和方法允许我们在不刷新浏览器的情况下从服务器加载数据. jQuery 采用了三层封装:最底层的封装方法为:$.ajax(),而通过这层封装了第二层有三种方法:.load().$.get()和$.post(),最高层是$.getScript()和$.getJSON()方法. 函数 描述 jQuery.ajax() 执行异步 HTTP (Ajax) 请求. .ajaxComplete() 当 Ajax 请求完成时注册要调用的处理程序.这是一个

Android:日常学习笔记(10)———使用LitePal操作数据库

Android:日常学习笔记(10)---使用LitePal操作数据库 引入LitePal 什么是LitePal LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式,将平时开发时最常用的一些数据库功能进行了封装,使得开发者不用编写一行SQL语句就可以完成各种建表.増删改查的操作.并且LitePal很"轻",jar包大小不到100k,而且近乎零配置,这一点和Hibernate这类的框架有很大区别.目前LitePal的源码已经托管到了GitHub上. 关

Knockout学习笔记(三)

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

sqlite学习笔记10:C语言中使用sqlite之查询和更新数据

前面说到的 sqlite_exec() 中的第三个参数, SQLite 将为 sql 参数内执行的每个 SELECT 语句中处理的每个记录调用这个回调函数. 本节添加了两个函数,selectFromTable和updateTable. 实例程序如下: #include <stdio.h> #include <stdlib.h> #include "sqlite/sqlite3.h" #define DB_NANE "sqlite/test.db&quo

lua学习笔记10:lua简单命令行

前面多次用了命令行,这次就好好学下命令行: 一 格式 lua [options][script][args] 二 具体命令 -e 直接将命令传个lua -l 加载一个文件 -i 进入交互模式 例如,终端输入: lua -e "print(math.sin(12))" lua学习笔记10:lua简单命令行,布布扣,bubuko.com

Knockout学习笔记(二)

这篇文章主要用于记录学习Working with observable arrays的测试和体会. Observable主要用于单一个体的修改订阅,当我们在处理一堆个体时,当UI需要重复显示一些样式相同的元素时,这些数据的绑定就需要依靠observable arrays. 特别需要注意的一点是,observable arrays关注的是数组中元素整体的变化(包括增加元素,删减元素,元素顺序的改变等等),而不是元素个体的变化(元素内部某些部分的改变). 我们可以在js文件中创建一个observab

python基础教程_学习笔记10:异常

异常 什么是异常 Python用异常对象来表示异常情况.遇到错误后,会引发异常.如果异常对象并未被处理或捕捉,程序就会用所谓的回溯(Traceback,一种错误信息)终止执行: >>> 1/0 Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> 1/0 ZeroDivisionError: integer division or modulo by