本篇使用Knockout在MVC下实现"Hello World",对应的官网实例在这里

当次数达到3:

View视图

页面包含三个部分:
1、显示点击按钮的次数
2、button按钮,每点击一次,显示的次数加1,并且,当次数达到3次,button禁用
3、最下面的div只有在次数达到3的时候才显示,并提供"重置"按钮

<div>You've clicked <span data-bind='text: numberOfClicks()'>&nbsp;</span> times</div>

<button data-bind='click: registerClick, disable: hasClickedTooManyTimes'>Click me</button>

<div data-bind='visible: hasClickedTooManyTimes'>
That's too many clicks! Please stop before you wear out your fingers.
<button data-bind='click: resetClicks'>Reset clicks</button>
</div>

Model领域模型

namespace MyMVCKnockout.Models
{
public class ClickCounterModel
{
public int NumberOfClicks { get; set; } public void RegisterClick()
{
NumberOfClicks++;
}
}
}

以上,NumberOfClicks属性用来记录当前的次数,当点击视图的button,就执行这里的RegisterClick()方法,使当前次数加一。

创建ClickCounterController:

using System.Web.Mvc;
using MyMVCKnockout.Models; namespace MyMVCKnockout.Controllers
{
public class ClickCounterController : Controller
{
public ActionResult Index()
{
return View();
} public JsonResult GetIntitial()
{
var model = new ClickCounterModel() {NumberOfClicks = 0};
Session["c"] = model;
return Json(model, JsonRequestBehavior.AllowGet);
} //每点击一次
public JsonResult RegisterClick()
{
var model = (ClickCounterModel) Session["c"];
model.RegisterClick();
return Json(model);
} //重置
public JsonResult ResetClick()
{
var model = new ClickCounterModel() { NumberOfClicks = 0 };
Session["c"] = model;
return Json(model);
}
}
}

以上,初始状态时,给ClickCounterModel的计次属性NumberOfClicks赋值为0次。通过Session维持ClickCounterModel上次的状态。当次数达到3次,点击前台视图的"重置"按钮,把ClickCounterModel的计次属性NumberOfClicks重新赋值为0次。

View Model视图模型

View Model中包括:
1、提供一个比如叫numberOfClicks的属性,通过ko.observable()方法,让它变得"observable"
2、提供一个当点击button按钮的一个函数,向控制器方法发出一个异步请求,回调函数得到的数据重新赋值给numberOfClicks的属性
3、提供一个当点击"重置"按钮的一个函数,向控制器方法发出一个异步请求,回调函数得到的数据重新赋值给numberOfClicks的属性
4、提供一个计算属性hasClickedTooManyTimes,以numberOfClicks为判断依据,当次数达到3次,就返回false

当然,这个View Model需要通过ko.applyBindings(viewModel)方法,与视图UI绑定起来。

ClickCounter/Index.cshtml完整如下:

@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
} <div>You've clicked <span data-bind='text: numberOfClicks()'>&nbsp;</span> times</div> <button data-bind='click: registerClick, disable: hasClickedTooManyTimes'>Click me</button> <div data-bind='visible: hasClickedTooManyTimes'>
That's too many clicks! Please stop before you wear out your fingers.
<button data-bind='click: resetClicks'>Reset clicks</button>
</div> @section scripts
{
<script src="~/Scripts/knockout-3.1.0.js"></script>
<script type="text/javascript">
$(function () {
var viewModel = new ClickCounterViewModel();
ko.applyBindings(viewModel); $.getJSON('@Url.Action("GetIntitial","ClickCounter")', function (data) {
viewModel.numberOfClicks(data.NumberOfClicks);
});
}); var ClickCounterViewModel = function () {
var self = this;
self.numberOfClicks = ko.observable(0); self.registerClick = function () {
$.ajax({
url: '@Url.Action("RegisterClick","ClickCounter")',
cache: false,
type: 'POST',
contentType: 'application/json; charset=utf-8',
//data: ko.toJSON(model),
data: {},
success: function(data) {
self.numberOfClicks(data.NumberOfClicks);
}
});
}; self.resetClicks = function () {
$.ajax({
url: '@Url.Action("ResetClick","ClickCounter")',
cache: false,
type: 'POST',
contentType: 'application/json; charset=utf-8',
//data: ko.toJSON(model),
data: {},
success: function (data) {
self.numberOfClicks(data.NumberOfClicks);
}
});
}; self.hasClickedTooManyTimes = ko.computed(function () {
return self.numberOfClicks() >= 3;
});
};
</script>
}

“Knockout官网实例在MVC下的实现”系列包括:

Knockout官网实例在MVC下的实现-01,实现Hello world

Knockout官网实例在MVC下的实现-02,实现计次

Knockout官网实例在MVC下的实现-02,实现计次的更多相关文章

  1. Knockout官网实例在MVC下的实现-01,实现Hello world

    本篇使用Knockout在MVC下实现"Hello World",对应的官网实例在这里. View视图 Knockout的一个特点是:声明式绑定,即Declarative bind ...

  2. activiti官网实例项目activiti-explorer之扩展流程节点属性2

    情景需求:需要查找activiti-explorer项目中获取流程id的方法,然后根据流程id获取相应字段在节点属性中添加内容. 大致流程:拿取整个流程id获取对应表单属性,在页面节点属性中展示对应表 ...

  3. 官网实例详解-目录和实例简介-keras学习笔记四

    官网实例详解-目录和实例简介-keras学习笔记四 2018-06-11 10:36:18 wyx100 阅读数 4193更多 分类专栏: 人工智能 python 深度学习 keras   版权声明: ...

  4. [ActionScript 3.0] Away3D 官网实例

    /* Dynamic tree generation and placement in a night-time scene Demonstrates: How to create a height ...

  5. Knockout 官网学习文档目录

    官网:https://knockoutjs.com/documentation/introduction.html Knockout-Validation: https://github.com/Kn ...

  6. Android自动化学习笔记之Robotium:学习官网实例

    ---------------------------------------------------------------------------------------------------- ...

  7. Knockout 官网翻译

    Knockout 新版应用开发教程之创建view models与监控属性 章节导航 最近抽出点时间研究MVVM,包括司徒正美的avalon,google的angular,以及Knockout,博客园T ...

  8. knockout——官网demo

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  9. angular官网实例(综合)

    第一部分: (应用的“外壳”) 1.新建项目: ng new mytest 2.进入项目目录,并启动这个应用. cd mytest ng serve --open 3.添加一个标题 打开 app.co ...

随机推荐

  1. Kafka ACL使用实战(单机版)

    一.简介 自0.9.0.0.版本引入Security之后,Kafka一直在完善security的功能.当前Kafka security主要包含3大功能:认证(authentication).信道加密( ...

  2. 2016-2017-2 20155309南皓芯《java程序设计》第七周学习总结

    教材学习内容总结 Lambda 一种匿名方法 表达式构成 括号以及括号里用逗号分隔的参数列表 仅有一个参数的可以省略括号 ->符号 花括号以及花括号里的语句 仅有一条语句时可以省略花括号,并且这 ...

  3. 树莓派3B安装远程

    步骤1:树莓派3安装 RDP SERVER 及VNC SERVER sudo apt-get install -y tightvncserver sudo vncserver 最后才知道一定要加上VN ...

  4. OneNote无法同时设置中英文字体设置解决办法

    如果你是一位OneNote老用户,无论是2003.2007还是2010或者最新的2013版本,都一直存在一个Bug,就是无法同时设置中英文字体(比如在Word中就可以分别设置不同的).我搜了一下,在微 ...

  5. CF 586B 起点到终点的最短路和次短路之和

    起点是右下角  终点是左上角 每次数据都是两行的点  输入n 表示有n列 接下来来的2行是 列与列之间的距离 最后一行是  行之间的距离 枚举就行   Sample test(s) input 41 ...

  6. HDU - 4465 期望 + 取log优化

    思路:这个求期望的公式很容易得到,但是在算的时候我们会遇到一个问题,就是组合数太大了根本存不下, 这时候就可以在计算的时候都取log,最后复原...  以前没遇到过.. #include<bit ...

  7. COCO 数据集使用说明书

    下面的代码改写自 COCO 官方 API,改写后的代码 cocoz.py 被我放置在 Xinering/cocoapi.我的主要改进有: 增加对 Windows 系统的支持: 替换 defaultdi ...

  8. Springboot listener

    在启动流程中,会出发许多ApplicationEvent.这时会调用对应的listener的onApplicationEvent方法.ApplicationEvent时观察者模式, (1) 实体继承A ...

  9. 为什么Java7开始在数字中使用下划线

    JDK1.7的发布已经介绍了一些有用的特征,尽管大部分都是一些语法糖,但仍然极大地提高了代码的可读性和质量.其中的一个特征是介绍字面常量数字的下划线.从Java7开始,你就可以在你的Java代码里把长 ...

  10. Replication Controller

    RC保证在同一时间能够运行指定数量的Pod副本,保证Pod总是可用.如果实际Pod数量比指定的多就结束掉多余的,如果实际数量比指定的少就启动缺少的. 当Pod失败.被删除或被终结时,RC会自动创建新的 ...