MVVM与Knockout
MVVM与Knockout
前言
今天搞的有点快,因为上午简单研究了下MVC,发现MVC不太适合前端开发,然后之前看几位前端前辈都推荐前端使用MVVM,但是我对其还不甚了解,所以我觉得下午还是应该先看看他是神马先,后面再决定要不要继续深入下去。
神马是MVVM?

借用我们百科一张美图,所谓MVVM就是model-view-viewmodel模型。
他是微软带来的一项新的技术体验,最先用于WPF,最后发现其模式对前端开发尤其比较合适,所以便在前端流行起来了。
MVVM是对MVC的一个改进,用以适应当代Web开发。
model为数据或者业务逻辑,完全与UI无关,它存储了状态并对问题领域做出处理,model可以写在代码里面或者用json表示、或者数据表中,反正他就是数据啦。
view表示可见元素,按钮、标签、图片等,我们可能会对各个标签绑定事件,但是我们知道这其实是原来controller该做的事情。
简单例子中view被直接绑定到model,model的一些部分只是简单单向绑定显示在view中。
PS:以上至于你们懂不懂,反正我是不懂了。。。用几个字形容就是模模糊糊
因为光是读概念无法了解到实质,所以我们来看看其使用吧!
Knockout
之前我们在写datalist的时候就有朋友提到这个东西,我当时也没有怎么关注,现在一起来看看吧:
knockout是一个轻量级UI库,通过应用MVVM(主角)模式使javascript前端UI简单化:

声明式绑定(declarative bindings)
使用简单的语法将模型model数据关联到dom元素上 UI界面自动刷新(automatic ui refresh)
当模型状态发生改变(model state),UI自动更新 依赖跟踪(dependency tracking)
为转变联合数据,在你的模型数据之间建立隐式关系 模板(templating)
为模型数据快速编写可嵌套的UI

根据以上描述,我们来跟进一番:
Knockout是一个以数据模型(data model)为基础的能够帮助你创建富文本,影响显示和编辑用户界面的javascript类库。
任何时候若是UI需要更新,knockout能够简单的帮助你实现并且容易维护。
但是究竟这个家伙是个神马呢?我也不知道,所以来试试吧。
初探knockout水深

1 <html xmlns="http://www.w3.org/1999/xhtml">
2 <head>
3 <title></title>
4 <script src="js/jquery-1.7.1.js" type="text/javascript"></script>
5 <script src="js/knockout-2.2.0.js" type="text/javascript"></script>
6 <script type="text/javascript">
7 var piliPerson = [
8 { name: '叶小钗', desc: '刀狂剑痴', weapon: '刀剑' },
9 { name: '素还真', desc: '清香白莲', weapon: '剑' },
10 { name: '一页书', desc: '百世经纶', weapon: '掌' }
11 ];
12 $(document).ready(function () {
13 var viewModel = {};
14 ko.applyBindings(viewModel);
15 });
16
17 </script>
18 </head>
19 <body>
20 <select data-bind="options: piliPerson, optionsText: 'name'">
21 </select>
22 </body>
23 </html>


PS:叶大侠之前写了一个dropdownlist与datalist的功能,好像与他有点类似呢:)
我们再拓宽:

1 <html xmlns="http://www.w3.org/1999/xhtml">
2 <head>
3 <title></title>
4 <script src="js/jquery-1.7.1.js" type="text/javascript"></script>
5 <script src="js/knockout-2.2.0.js" type="text/javascript"></script>
6 <script type="text/javascript">
7 var piliPerson = [
8 { name: '叶小钗', desc: '刀狂剑痴', weapon: '刀剑', key: 'yxc' },
9 { name: '素还真', desc: '清香白莲', weapon: '剑', key: 'shz' },
10 { name: '一页书', desc: '百世经纶', weapon: '掌', key: 'yys' }
11 ];
12 $(document).ready(function () {
13 var viewModel = {
14 //observable是一个KO的基础概念,UI可健康(observe)他的值,并且回应他的变化
15 //这里相当于设置了其选择项,当前选择的素还真
16 choseObj: ko.observable(piliPerson[1])
17 };
18 ko.applyBindings(viewModel);
19 });
20
21 </script>
22 </head>
23 <body>
24 <select data-bind="options: piliPerson, optionsText: 'name', value: choseObj">
25 <option ></option>
26 </select>
27 选择了:<span data-bind="text: choseObj().name"></span>
28 </body>
29 </html>

这个例子很精彩,我们选择后,选择结果会马上体现出来,初始化当然也是对的:

比较神奇的是,我们可以在标签里面使用函数了,和最初的.net越来越靠近了:
function formatStr(name) {
return name ? '霹雳人物:' + name : '';
}
<span data-bind="text: formatStr(choseObj().name)"></span>

PS:在此小叶子已经认识到了knockout的强大了,小叶子写的那个算是玩具吧。
PS2:我感觉如此使用后,对jquery的依赖降低了哦
惊叹
使用了KO后,似乎我数据模型发生改变了,可能会发生级联反应哦,曾经可能需要手动操作的事情,现在ko帮我们做了!!!
结语
经过今天的学习,虽然没能完全了解MVVM是什么,但是也有所增长,更是发现了ko这个神器,真是不错。
但是,因为我们最近的学习重点,是我们的小窗口,所以这里ko暂时放下,在我们小窗口靠一段落后,我们一起来学习ko先!
MVVM与Knockout的更多相关文章
- 【javascript激增的思考03】MVVM与Knockout
前言 今天搞的有点快,因为上午简单研究了下MVC,发现MVC不太适合前端开发,然后之前看几位前端前辈都推荐前端使用MVVM,但是我对其还不甚了解,所以我觉得下午还是应该先看看他是神马先,后面再决定要不 ...
- 【原】Bootstrap+Knockout.JS+ASP.Net MVC3+PetaPOCO实现CRUD操作
1.需求: 1.1)页面要美观大气 1.2)前端代码要简洁清晰,要用MVC或是MVVM框架 1.3)服务端要用MVC框架,要Rest风格 1.4)数据访问要用ORM 2.效果: 2.1)列表 2.2) ...
- Knockout.js随手记(1)
新的开始,knockout.js 1.首先去http://knockoutjs.com/index.html下载knockout.js,最新的版本是2.3 2.知道什么是Knockout?它是个Jav ...
- 【ASP.NET Web API教程】2.3.5 用Knockout.js创建动态UI
原文:[ASP.NET Web API教程]2.3.5 用Knockout.js创建动态UI 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容 ...
- Bootstrap+Knockout.JS+ASP.Net MVC3+PetaPOCO实现CRUD操作
Bootstrap+Knockout.JS+ASP.Net MVC3+PetaPOCO实现CRUD操作 1.需求: 1.1)页面要美观大气 1.2)前端代码要简洁清晰,要用MVC或是MVVM框架 1. ...
- 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用
由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...
- Vue.js:轻量高效的前端组件化方案
转发一篇尤老师对vue.js的介绍,了解vue.js的来龙去脉.不过现在已经是2.0了,也有添加一些新的东西,当然有些东西也改了. Vue.js:轻量高效的前端组件化方案 Vue.js 是我在2014 ...
- vue.js组件化开发实践
前言 公司目前制作一个H5活动,特别是有一定统一结构的活动,都要码一个重复的轮子.后来接到一个基于模板的活动设计系统的需求,便有了下面的内容.借油开车. 组件化 需求一到,接就是怎么实现,技术选型自然 ...
- Vue.js:轻量高效的前端组件化方案(转载)
摘要:Vue.js通过简洁的API提供高效的数据绑定和灵活的组件系统.在前端纷繁复杂的生态中,Vue.js有幸受到一定程度的关注,目前在GitHub上已经有5000+的star.本文将从各方面对Vue ...
随机推荐
- Asp.net MVC + EF + Spring.Net 项目实践(二)
这一篇主要介绍数据库和entity framework集成 1. 先创建数据库,很简单的几张表,但也涉及了一些主外键关系.联合主键等,关系图如下(DB脚本在最后) 2. 打开VS,现在建立Model实 ...
- Socket 学习(三)
前2节,说的是 Server 与 Client 的数据交互.服务端IP.端口固定,客户端 网服务端发送消息的时候,他的Socket对面被服务端获取到了,而且链接没有中断,他当然可以很容易回复信息. 现 ...
- code forces 148D Bag of mice (概率DP)
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
- 如何为你的初创应用App开发公司建立战略计划(商业战略竞争五力学)
首先,什么是战略计划?战略计划可以定义为一个为了达到目标而需要执行的一系列动作步骤的计划. 根据当今全球第一战略权威,商业管理界公认的"竞争战略之父"Michael Porter著 ...
- SQL常规查询详解
一.交叉连接(cross join) 交叉连接(cross join):有两种,显式的和隐式的,不带on子句,返回的是两表的乘积,也叫笛卡尔积. 例如:下面的语句1和语句2的结果是相同的. 语句1:隐 ...
- C#中使用消息队列RabbitMQ
在C#中使用消息队列RabbitMQ 2014-10-27 14:41 by qy1141, 745 阅读, 2 评论, 收藏, 编辑 1.什么是RabbitMQ.详见 http://www.rabb ...
- HDU 4812 D Tree 树分区+逆+hash新位置
意甲冠军: 特定n点树 K 以下n号码是正确的点 以下n-1行给出了树的侧. 问: 所以,如果有在正确的道路点图的路径 % mod = K 如果输出路径的两端存在. 多条路径则输出字典序最小的一条. ...
- Oracle笔试题库 附参考答案
1. 下列不属于ORACLE的逻辑结构的是(C) 区 段 数据文件 表空间 2. 下面哪个用户不是ORACLE缺省安装后就存在的用户(A) A . SYSDBA B. SYSTEM C. SCOTT ...
- 经典的SQL语句面试题
Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 问题 ...
- Toast,AlertDialog的误解
在一般的软件开发中,子线程中是不能更改UI主线程中创建的UI控件的.之前的理解是Toast也不能在子线程中创建.事实上并不是这样子的. @Override protected void onCreat ...