MVVM 小雏形 knockout
前言
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的更多相关文章
- MVVM大比拼之knockout.js源码精析
简介 本文主要对源码和内部机制做较深如的分析,基础部分请参阅官网文档. knockout.js (以下简称 ko )是最早将 MVVM 引入到前端的重要功臣之一.目前版本已更新到 3 .相比同类主要有 ...
- 前端MVVM学习之KnockOut(一)
MVVM理解 MVVM即Model-View-viewModel,是微软WPF和MVP(Model-View-Presenter)结合发展演变过来的一种新型架构框架. MVVM设计模式有以下优点: ( ...
- 前端MVVM框架:Knockout.JS(一)
前言 在我们平时开发 Web 应用程序的时候,如果项目不算特别大的话,一般都是拿 jQuery 再配合一些前端 UI 框架就在项目上面应用了.如果页面逻辑稍微复杂的话,那个在写前端 JavaScrip ...
- Vue.js 和 MVVM 小细节
MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态改变可以自 ...
- 前端MVVM学习之KnockOut(二)
现在开始学习Knockout并且做个简单的例子. Knockout是建立在以下三个核心功能之上的: 1.Observables and dependency tracking(属性监控与依赖跟踪) 2 ...
- mvvm小论(暂记)
广州-PC26(34627) 2:09:44 在android 线程最后用 handler = new Handler(); updateThread = new Runnabl ...
- vue和mvvm的一些小区别
Vue.js 和 MVVM 小细节 MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这 ...
- MVVM大比拼小结
目前完成4篇源码分析文章: MVVM大比拼之knockout.js源码精析 MVVM大比拼之avalon.js源码精析 MVVM大比拼之vue.js源码精析 MVVM大比拼之AngularJS源码精析 ...
- 【Knockout】二、监控属性Observables
MVVM和viewModel Knockout是建立在以下三大核心功能之上的: 监控属性和依赖跟踪(Observables and dependency tracking) 声明式绑定(Declara ...
随机推荐
- Redis 到底是单线程还是多线程?我要吊打面试官!
最近在Java技术栈公众号发布的一篇文章,其中有一道题: Redis是多线程还是单线程?(回答单线程的请回吧,为什么请回,请往下看) 好些粉丝在后台问我:为什么请回,Redis不是单线程吗? 大家注意 ...
- P2320鬼谷子的钱袋(分治)
------------恢复内容开始------------ 描述:https://www.luogu.com.cn/problem/P2320 m个金币,装进一些钱袋.钱袋中大于1的钱互不相同. 问 ...
- Day_09【常用API】扩展案例7_验证QQ号是否正确
需求说明 请用户输入一个"QQ号码",我们来判断这个QQ号码是否正确 要求:使用方法来完成判断功能 验证规则: 1)必须是5-12位数字: 2)首位不能是0: package co ...
- 【Hadoop离线基础总结】伪分布模式环境搭建
伪分布模式环境搭建 服务规划 适用于学习测试开发集群模式 步骤 第一步:停止单节点集群,删除/export/servers/hadoop-2.7.5/hadoopDatas,重新创建文件夹 停止单节点 ...
- 基于R语言的航空公司客户价值分析
分析航空公司现状 1.行业内竞争 民航的竞争除了三大航空公司之间的竞争之外,还将加入新崛起的各类小型航空公司.民营航空公司,甚至国外航空巨头.航空产品生产过剩,产品同质化特征愈加明显,于是航空公司从价 ...
- Docker之docker log详解
1.显示所有log docker logs [OPTIONS] <CONTAINER> #显示某个容器的所有log docker-compose logs #显示启动的所有容器的lo ...
- 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 ...
- bash leetcode
拓展:grep 193. ref: https://blog.csdn.net/yanglingwell/article/details/82343407 Given a text file fil ...
- 策略模式C++实现
#include <iostream> using namespace std; class Strategy; class Context { public: Context(Strat ...
- Java常用设计模式详解1--单例模式
单例模式:指一个类有且仅有一个实例 由于单例模式只允许有一个实例,所以单例类就不可通过new来创建,而所有对象都默认有一个无参的构造函数可以创建对象,所以单例类不仅不能提供public的构造方法,还需 ...