前言

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. Coursera课程笔记----计算导论与C语言基础----Week 12

    期末编程测试(Week 12) Quiz1 判断闰年 #include <iostream> using namespace std; int main() { int year; cin ...

  2. 【Hadoop离线基础总结】oozie的安装部署与使用

    目录 简单介绍 概述 架构 安装部署 1.修改core-site.xml 2.上传oozie的安装包并解压 3.解压hadooplibs到与oozie平行的目录 4.创建libext目录,并拷贝依赖包 ...

  3. 装完B就跑,这几个Linux指令真的Diǎo

    本文介绍一些有趣的指令,实用或者可以装逼,不妨自己也来试试看: 文章目录 1 故事的开局 2 杰哥的表演 2.1 sl 2.2 htop 2.3 gcp 2.4 hollywood 2.5 cmatr ...

  4. properties文件导出

    功能要求根据数据库记录的key-value-remark 数据,导出保存properties文件 1. pro.load()  pro.list() 处理不能解决备注.排序问题 2. 最后考虑下什么是 ...

  5. java套打

    1:套打可能是以后软件开发可能会涉及到的功能,主要麻烦地方就是需要精确定位,光是打印发票还好,要是打印那种协议类型的特别麻烦,不仅长而且需要的数据多 ,定位麻烦. 2:而且大多数情况是需要去除页眉页脚 ...

  6. js中的栈,堆。

    一.栈和堆 栈(stack):栈会自动分配内存空间,会自动释放,存放基本类型,简单的数据段,占据固定大小的空间. 基本类型:String,Number,Boolean,Null,Undefined 堆 ...

  7. 开始写博客的第一天,如何用c实现“hello wolrd”

    “hello world” 应该是大多数人学习的第一个代码 那也就作为我第一篇博客的开端吧 实现的代码如下 #include <stdio.h> int main() { printf(& ...

  8. css中文字两端对齐兼容IE

    text-align: justify; text-justify:inter-ideograph;

  9. python中的基础坑

    v = [lambda :x for x in range(10)] print(v) #[lambda :x,lambda :x....]10个匿名函数 print(v[0]) #lambda :x ...

  10. SpringBoot代码生成器,从此不用手撸代码

    前言 通常在开始开发项目的时候,首先会建立好数据库相关表,然后根据表结构生成 Controller.Service.DAO.Model以及一些前端页面. 如果开发前没有强制的约束,而每个程序员都有自己 ...