利用avalon 实现一个简单的成绩单
本文的灵感是来自Halower的这篇博文,他是使用knockout与jQuery实现的。不过我觉得MVVM本来就强大的事件绑定功能,因此用jQuery 是多此一举。另,他也用了一些面向对象的写法。我个人认为,纯数据就该好好当纯数据,作为数据模型(M)而存在,想操作数据,则交由视图模型(VM)。在angularjs流行的一些成规,都是要求大家不要自己操作DOM,DOM是框架自行帮你偷偷搞定。这也与avalon一直提倡的“操作数据即操作DOM”的理念相符。由于avalon巧妙地利用了Object.defineProperty, __defineSetter__, __defineGetter__, VBScript等方法把等于号(=)重载了,因此与视图的同步就变得比其他MVVM更隐秘神奇。那么接着下来,让我们看看avalon是如何实现这个功能吧。
首先是视图层,里面的绑定属性其实可以在VM中的属性定了下来再添加。这也涉及MVVM另一个优势,分离关注点,因此切图与JS编程可以同时进行。由于JS代码不进行DOM操作,页面长得怎么样也无所谓,我又不需要选择器引擎!
<div ms-controller="grid" class="grid" >
<div>
<p> <input ms-duplex="id">
<input ms-duplex="name">
<input ms-duplex="score" data-duplex-event="change"></p>
<p><button ms-click="add"> add</button></p>
</div>
<p>共{{array.size()}}条------------------合计{{total}}分</p>
<table>
<thead>
<tr>
<th>ID</th> <th>姓名</th> <th>分数</th> <th>操作</th>
</tr>
</thead>
<tbody ms-each-el="array">
<tr>
<td>{{el.id}}</td>
<td>{{el.name}}</td>
<td>{{el.score}}</td>
<td align="center"><a ms-click="$remove" href="javascript:void(0)">移除</a></td>
</tr>
</tbody>
</table>
<textarea ms-value="JSON.stringify(array.$model)" style="width:90%;height:220px;"></textarea>
</div>
样式随便弄弄:
.grid table{
border:1px solid #000;
width:500px;
border-collapse: collapse;
}
.grid button{
width:400px;
background: orange;
}
.grid table th, .grid table td{
border:1px solid #000;
padding: 2px 5px;
}
从HTML结构来看,分为两部分,一个是用于输入数据,另一个是呈现所有数据,数据上方还有个小统计。输入数据部分有三个输入项,我们对分数中进行校验,只保证其是数字就行了,目的是为了相加,因为input的value属性总为一个字符串类型。下方有个按钮,用于提交。呈现区为一个table,所有MVVM框架都支持数组循环输出,我的与angular走得很近。在循环区域,里面还内置一个$remove方法,用于删除监控数组中的某一个元素,这个比knockout人性化多了。下面是JS部分,你是看不到一句操作DOM的代码。
//如果大家对avalon不熟悉,可以参看这篇入门教程 http://www.cnblogs.com/rubylouvre/p/3181291.html
avalon.ready(function() {
var model = avalon.define('grid', function(vm) {
vm.id = ""
vm.name = ""
vm.score = 0
vm.total = 0vm.add = function() {
if(vm.id && vm.name ){
vm.array.push({
id: vm.id,
name: vm.name,
score: vm.score
})
}
}
vm.array = []
});model.$watch("score", function(a) {
var a = Number(a) || 0
a = a > 100 ? 100 : a我们在define方法中定义了VM所有用到的数据,什么id, name, score, array, 还有需要绑到视图中的add方法。数据校验或数据变动时需要做的操作,我们是用$watch实现,它们被安排到define方法外,这是一个好主意。然后,就没有然后了!这就是MVVM的神奇之处,因为我们在视图中使用了{{}}, ms-click已经指明了它们的行为。因此当数据变动时,框架自然明白自己该什么做。
add
共{{array.size()}}条------------------合计{{total}}分
ID 姓名 分数 操作 {{el.id}} {{el.name}} {{el.score}} 移除 avalon.ready(function() {
var model = avalon.define('grid', function(vm) {
vm.id = ""
vm.name = ""
vm.score = 0
vm.total = 0vm.add = function() {
if(vm.id && vm.name ){
vm.array.push({
id: vm.id,
name: vm.name,
score: vm.score
})
}
}
vm.array = []
});model.$watch("score", function(a) {
var a = Number(a) || 0
a = a > 100 ? 100 : a.grid table{
border:1px solid #000;
width:500px;
border-collapse: collapse;
}
.grid button{
width:400px;
background: orange;
}
.grid table th, .grid table td{
border:1px solid #000;
padding: 2px 5px;
}目前我与5群的一些人已经将avalon应用于公司的生产环境,反应还是不错。虽然目前还不时冒出一些怪异的BUG,但难度不至于影响我们的进度,基本上半天就能修,比如说IE9-10的option标签的value问题,firefox 全系列下,未插入DOM树的元素的display样式取值问题,这是jQuery也没报到的新东西。有的话,我在做mass Framework时已经遇到过了。MVVM是一个全新的领域,要求对用户全面隐藏DOM操作,并将整个DOM树作为一个动态模板或数个复用的子模板,另外,DOM树其实也被我框架看作为一个Ioc容器的配置文件。如此种种,遭遇新的问题在所难免,但只要方向是对的,这就是康庄大道。虽然它与jQuery走的是一条截然不同的路,但明显优于jQuery。jQuery与DOM存在强依赖,导致维护成本奇高。这正是西方继jQuery后,又孜孜不倦发明backbone, canjs, knockout, emberjs, angular的原因。现在国内的技术步伐普通比外国慢两三年,现在前端MVVM已经在外国非常盛行,希望国人不要再落后太多了。
利用avalon 实现一个简单的成绩单的更多相关文章
- avalon实现一个简单的带增删改查的成绩单
自从angular问世,一直就有去了解学习angular,一直想用angular去做一个项目,但无奈,大ng是国外产物,ng1.2版本就只兼容到IE8,1.3后的几个版本提升到IE9,据说NG2.0更 ...
- 利用ANTLR4实现一个简单的四则运算计算器
利用ANTLR4实现一个简单的四则运算计算器 ANTLR4介绍 ANTLR能够自动地帮助你完成词法分析和语法分析的工作, 免去了手写去写词法分析器和语法分析器的麻烦 它是基于LL(k)的, 以递归下降 ...
- 利用 nodeJS 搭建一个简单的Web服务器(转)
下面的代码演示如何利用 nodeJS 搭建一个简单的Web服务器: 1. 文件 WebServer.js: //-------------------------------------------- ...
- 利用VS2008发布一个简单的webservice
一个开发好的webservice,怎样发布出去,供其他电脑访问呢? 本文将介绍如何发布一个简单的webservice,其中的内容都是在网上查看别人文章,自己仿照着做了一遍,因此,难免会发生错误,如果发 ...
- 利用java实现一个简单的远程监控程序
一般的远程监控软件都是用c或者c++等语言开发的,而使用java如何来实现相同的功能呢. 首先我们先介绍一下一个简单的远程监控程序的实现原理. 功能一,远程屏幕监视 (1) 必须要有监控端与被监控端, ...
- 利用jmeter做一个简单的性能测试并进行参数化设置
1.新增一个线程组,并在下面添加基本原件,包括:监听器.http请求默认值和一个事务控制器 在http请求默认值中填写 ip 地址和端口号,协议类型默认为http 2.添加代理服务器,以便之后进行录制 ...
- Asp.NetMVC利用LigerUI搭建一个简单的后台管理详解(函登录验证)
上一篇 Asp.Net 中Grid详解两种方法使用LigerUI加载数据库数据填充数据分页 了解了LigerUI 中Grid的基本用法 现在结合上一篇的内容做一个简单的后台管理,当然也有前台的页面 ...
- 利用OD破解一个简单的C语言程序
最近在学习汇编(看的是王爽老师的<汇编语言(第三版)>),然后想尝试使用OD(Ollydbg)软件破解一个简单的C语言程序练练手. 环境: C语言编译环境:VC++6.0 系统:在Wind ...
- 利用 Docker 构建一个简单的 java 开发编译环境
目前 Java 语言的版本很多,除了常用的 Java 8,有一些遗留项目可能使用了 Java 7,也可能有一些比较新的的项目使用了 Java 10 以上的版本.如果想切换自己本地的 Java 开发环境 ...
随机推荐
- 求两个集合的交集和并集C#
我是用hashset<T>来实现的 具体如代码所示 using System; using System.Collections.Generic; using System.Linq; u ...
- [03]APUE:文件 I/O
[a] open #include <fcntl.h> int open(const char *path, int oflag, ... ,mode_t mode) 成功返回文件描术符, ...
- VM安装OracleLinux
http://blog.csdn.net/highning/article/details/11556077 一步一步教你在VMware Workstation 10 安装 Oracle Linux ...
- Hadoop入门之安装配置(hadoop-0.20.2)
Hadoop,简单理解为HDFS(分布式存储)+Mapreduce(分布式处理),专为离线和大规模数据分析而设计. Hadoop可以把很多linux的廉价PC组成分布式结点,然后编程人员也不需要知道分 ...
- Linux三剑客之awk
awk awk是linux下的一个命令,他对其他命令的输出,对文件的处理都十分强大,其实他更像一门编程语言,他可以自定义变量,有条件语句,有循环,有数组,有正则,有函数等.他读取输出,或者文件的方式是 ...
- 异常:System.Data.EvaluateException: 未找到列[District].
异常:System.Data.EvaluateException: 未找到列[District]. 这里存在的问题不一定是说,数据源表没有该字段.此问题在于数据库字段包含空格字符.
- AOP实现原理
Spring 为解耦而生,其中AOP(面向切面编程)是很浓重的一笔. 本文来探讨一下AOP实现的原理. 一. 概述 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负 ...
- 我对C#的理解
C#里面所有东西都可以看作对象.接口,类,枚举等等. 类是最常用的,可以继承别的接口,类等,就会自动拥有别人的功能. 接口是类的概要.给别人看的协议,好像一个人对外做出的承诺. 抽象类是实现了部分承诺 ...
- C#匿名函数的坑
在for循环中catch索引 for (int i = 0; i < n; i++) { foo(() =>{ if (i == x) //这里的i始终都是最后一个... { //bala ...
- UVALive 4329 Ping pong(树状数组)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=13895 题意:一条街上住有n个乒乓选手,每个人都有一个技能值,现在 ...