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 ...
随机推荐
- Coursera课程笔记----计算导论与C语言基础----Week 12
期末编程测试(Week 12) Quiz1 判断闰年 #include <iostream> using namespace std; int main() { int year; cin ...
- 【Hadoop离线基础总结】oozie的安装部署与使用
目录 简单介绍 概述 架构 安装部署 1.修改core-site.xml 2.上传oozie的安装包并解压 3.解压hadooplibs到与oozie平行的目录 4.创建libext目录,并拷贝依赖包 ...
- 装完B就跑,这几个Linux指令真的Diǎo
本文介绍一些有趣的指令,实用或者可以装逼,不妨自己也来试试看: 文章目录 1 故事的开局 2 杰哥的表演 2.1 sl 2.2 htop 2.3 gcp 2.4 hollywood 2.5 cmatr ...
- properties文件导出
功能要求根据数据库记录的key-value-remark 数据,导出保存properties文件 1. pro.load() pro.list() 处理不能解决备注.排序问题 2. 最后考虑下什么是 ...
- java套打
1:套打可能是以后软件开发可能会涉及到的功能,主要麻烦地方就是需要精确定位,光是打印发票还好,要是打印那种协议类型的特别麻烦,不仅长而且需要的数据多 ,定位麻烦. 2:而且大多数情况是需要去除页眉页脚 ...
- js中的栈,堆。
一.栈和堆 栈(stack):栈会自动分配内存空间,会自动释放,存放基本类型,简单的数据段,占据固定大小的空间. 基本类型:String,Number,Boolean,Null,Undefined 堆 ...
- 开始写博客的第一天,如何用c实现“hello wolrd”
“hello world” 应该是大多数人学习的第一个代码 那也就作为我第一篇博客的开端吧 实现的代码如下 #include <stdio.h> int main() { printf(& ...
- css中文字两端对齐兼容IE
text-align: justify; text-justify:inter-ideograph;
- python中的基础坑
v = [lambda :x for x in range(10)] print(v) #[lambda :x,lambda :x....]10个匿名函数 print(v[0]) #lambda :x ...
- SpringBoot代码生成器,从此不用手撸代码
前言 通常在开始开发项目的时候,首先会建立好数据库相关表,然后根据表结构生成 Controller.Service.DAO.Model以及一些前端页面. 如果开发前没有强制的约束,而每个程序员都有自己 ...