前言

knockout学过的当工具脚本用,就像jquery一样使用,学习成本15分钟,没学过的可学可不学。

knockout 是上古神器,话说在远古开天辟地,前端到处是飞禽走兽,一片混乱。

这时候人类开始人类开始诞生了,因为恶劣的环境备受煎熬,在生存角逐中,人们通过智慧写了各种js脚本,进入了石器时代,但是人类只有两条腿和两只手切换工具的速度限制了人类的发展。

这时候John Resig 整理了各种工具,注入熔炉,一件草莽神器诞生了,jquery。人们开始利用jquery,在html上开垦大地,马力十足,这是一个被jquery奴隶的时代,史称奴隶时代。

后来人们就发现了一个问题,在html中这块广袤的大地上,js不同脚本是冲突的,部落与联盟之间的战争一触即发。随着因为冲突,调试繁琐,js的部落与部落之间在战争中,被require.js等模块管理所统治,不同的部落得到分封,进入了封建时代。

但是几乎在同一时间,mvvm思想开始萌芽,他们提出有一个假设,如果可以修改数据就能对html产生驱动变化,那么是不是可以解放生产力?这个实现不断得到验证与实际,工业革命诞生了。这是一次没有流血的革命,因为以前的技术诞生往往充满着争议,这个是真的解放人类的双手,蒸汽时代开始来临。

knockout 就是蒸汽时代的产物,它是mvvm模式在js实现的前驱,是现在电力时代3大框架的基石。好了,故事模式结束。

正文

首先说明一下什么是mvvm,它是一种模式,还有一些其他模式比如说mvc,mvp等等。

他们其实是一个重的问题,偏向于哪一块。

mvc的c很重,那么它的重点功能在于控制器,可以说是c连接了视图和model。

mvp的p很重,他们的视图和model完全分离,中间p的其实相当于c,操作层,但是和mvc不同的是隔离了model层和视图。比如说window form开发。

mvvm,偏向view,和mvp完全相反,他的视图和数据层相当紧密,两者不可分割。knockout就是一个例子,包括现在比较成熟的框架vue。

knockout它的作用就是一个重要功能在于监听,监听数据的变化,然后从新部分渲染。

那么开始实践一下吧:

public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Category { get; set; }
public decimal Price { get; set; }
}

一个model类,里面存放这id,name,category,price,对应数据库。

然后编辑控制器:

public class HomeController : Controller
{
static List<Product> productsList = new List<Product>();
public IActionResult Index()
{
return View();
} [HttpGet]
public IActionResult products() { productsList = new List<Product>() {
new Product{Id=1,Category="哈哈",Name="张三",Price=10 },
new Product{Id=2,Category="哈哈",Name="李小二",Price=10 }
};
return Json(productsList);
}
}

这里面只是提供一些数据:

前台:

html部分

<table id="products">
<thead>
<tr><th>ID</th><th>Name</th><th>Category</th><th>Price</th></tr>
</thead>
<tbody data-bind="foreach: products">
<tr>
<td data-bind="text: id"></td>
<td data-bind="text: name"></td>
<td data-bind="text: category"></td>
<td data-bind="text: price"></td>
</tr>
</tbody>
</table>

js 部分:

function ViewModel() {
var self = this;
//创建绑定
self.products = ko.observableArray(); // 创建数组绑定。
self.product = ko.observable();//单个产品
self.status = ko.observable();//单个错误提示
// 得到全部的产品
self.getAll = function () {
self.products.removeAll();
$.getJSON("/Home/products", function (products) {
self.products(products);
});
}
//更新
self.update = function () {
self.status("");
var id = $('#productId').val();
var product = {
Name: $('#name').val(),
Price: $('#price').val(),
Category: $('#category').val()
};
$.ajax({
url: '/Home/products/' + id,
cache: false,
type: 'PUT',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(product),
success: self.getAll
})
.fail(
function (xhr, textStatus, err) {
self.status(err);
});
}
//新增
self.create = function () {
self.status("");
var product = {
Name: $('#name2').val(),
Price: $('#price2').val(),
Category: $('#category2').val()
};
$.ajax({
url: '/Home/products',
cache: false,
type: 'POST',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(product),
statusCode: {
201 /*Created*/: function (data) {
//得到返回结果然后返回添加添加
self.products.push(data);
}
}
})
.fail(
function (xhr, textStatus, err) {
self.status(err);
});
}
//初始化
self.getAll();
} $(function () {
var viewModel = new ViewModel();
ko.applyBindings(viewModel);
})

在里面配置增删改查即可,里面配置的方法可以在html这样写自动绑定:

<button data-bind="click: $root.create">添加</button>

就会触发里面的create 方法。

这里只是作为一个绑定用例,其实在真正的编辑中是全部绑定的,不会出现这种$('#productName').val();

而是使用:

<input data-bind="value: $root.Name" type="text" title="Name" />

在此就不多复述。

效果:

总结

感觉 knockout 也不是完全过时,小型的开发速率还是非常快的,绑定就完事,源码也少,vs 编辑器也支持提示。

MVVM 小雏形 knockout的更多相关文章

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

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

  2. 前端MVVM学习之KnockOut(一)

    MVVM理解 MVVM即Model-View-viewModel,是微软WPF和MVP(Model-View-Presenter)结合发展演变过来的一种新型架构框架. MVVM设计模式有以下优点: ( ...

  3. 前端MVVM框架:Knockout.JS(一)

    前言 在我们平时开发 Web 应用程序的时候,如果项目不算特别大的话,一般都是拿 jQuery 再配合一些前端 UI 框架就在项目上面应用了.如果页面逻辑稍微复杂的话,那个在写前端 JavaScrip ...

  4. Vue.js 和 MVVM 小细节

    MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态改变可以自 ...

  5. 前端MVVM学习之KnockOut(二)

    现在开始学习Knockout并且做个简单的例子. Knockout是建立在以下三个核心功能之上的: 1.Observables and dependency tracking(属性监控与依赖跟踪) 2 ...

  6. mvvm小论(暂记)

    广州-PC26(34627) 2:09:44 在android 线程最后用 handler = new Handler();            updateThread = new Runnabl ...

  7. vue和mvvm的一些小区别

    Vue.js 和 MVVM 小细节   MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这 ...

  8. MVVM大比拼小结

    目前完成4篇源码分析文章: MVVM大比拼之knockout.js源码精析 MVVM大比拼之avalon.js源码精析 MVVM大比拼之vue.js源码精析 MVVM大比拼之AngularJS源码精析 ...

  9. 【Knockout】二、监控属性Observables

    MVVM和viewModel Knockout是建立在以下三大核心功能之上的: 监控属性和依赖跟踪(Observables and dependency tracking) 声明式绑定(Declara ...

随机推荐

  1. Redis 到底是单线程还是多线程?我要吊打面试官!

    最近在Java技术栈公众号发布的一篇文章,其中有一道题: Redis是多线程还是单线程?(回答单线程的请回吧,为什么请回,请往下看) 好些粉丝在后台问我:为什么请回,Redis不是单线程吗? 大家注意 ...

  2. P2320鬼谷子的钱袋(分治)

    ------------恢复内容开始------------ 描述:https://www.luogu.com.cn/problem/P2320 m个金币,装进一些钱袋.钱袋中大于1的钱互不相同. 问 ...

  3. Day_09【常用API】扩展案例7_验证QQ号是否正确

    需求说明 请用户输入一个"QQ号码",我们来判断这个QQ号码是否正确 要求:使用方法来完成判断功能 验证规则: 1)必须是5-12位数字: 2)首位不能是0: package co ...

  4. 【Hadoop离线基础总结】伪分布模式环境搭建

    伪分布模式环境搭建 服务规划 适用于学习测试开发集群模式 步骤 第一步:停止单节点集群,删除/export/servers/hadoop-2.7.5/hadoopDatas,重新创建文件夹 停止单节点 ...

  5. 基于R语言的航空公司客户价值分析

    分析航空公司现状 1.行业内竞争 民航的竞争除了三大航空公司之间的竞争之外,还将加入新崛起的各类小型航空公司.民营航空公司,甚至国外航空巨头.航空产品生产过剩,产品同质化特征愈加明显,于是航空公司从价 ...

  6. Docker之docker log详解

    1.显示所有log docker logs [OPTIONS] <CONTAINER>   #显示某个容器的所有log docker-compose logs  #显示启动的所有容器的lo ...

  7. filebeat-kafka:WARN producer/broker/0 maximum request accumulated, waiting for space

    You need to configure 3 things: Brokers Filebeat kafka output Consumer Here a example (change paths ...

  8. bash leetcode

    拓展:grep 193.  ref: https://blog.csdn.net/yanglingwell/article/details/82343407 Given a text file fil ...

  9. 策略模式C++实现

    #include <iostream> using namespace std; class Strategy; class Context { public: Context(Strat ...

  10. Java常用设计模式详解1--单例模式

    单例模式:指一个类有且仅有一个实例 由于单例模式只允许有一个实例,所以单例类就不可通过new来创建,而所有对象都默认有一个无参的构造函数可以创建对象,所以单例类不仅不能提供public的构造方法,还需 ...