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


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


    2

    当次数达到3:
    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,实现计次

  • 相关阅读:
    基于连通性状态压缩的动态规划问题
    2005年IT行业趋势Top10
    企业应用之性能实时度量系统演变
    云计算参考架构几例
    在CentOS上构建.net自动化编译环境
    Asp.net SignalR 实现服务端消息推送到Web端
    餐饮行业解决方案之客户分析流程
    餐饮行业解决方案之采购战略制定与实施流程
    餐饮行业解决方案之业务设计流程
    零售连锁专卖信息化解决方案简介之三
  • 原文地址:https://www.cnblogs.com/darrenji/p/3838468.html
Copyright © 2020-2023  润新知