热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaScriptMVC进修笔记(七)模子之ORM

耐久化纪录须要一种对峙纪录耐久化的要领,行将援用保留至新建立的实例中以便任何时刻都能接见它。经由过程在Model中运用records对象来完成。当保留一个实例的时刻,就将它添加进这

耐久化纪录

须要一种对峙纪录耐久化的要领,行将援用保留至新建立的实例中以便任何时刻都
能接见它。经由过程在Model 中运用records 对象来完成。当保留一个实例的时刻,
就将它添加进这个对象中;当删除实例时,和将它从对象中删除:

// 用来保留资本的对象
Model.records = {};
Model.include({
newRecord: true,
create: function(){
this.newRecord = false;
this.parent.records[this.id] = this;
},
destroy: function(){
delete this.parent.records[this.id];
}
});

更新一个已存在的实例——只需更新对象援用即可:

Model.include({
update: function(){
this.parent.records[this.id] = this;
}
});

如今建立一个快速函数来保留实例,如许就不必每次都搜检这个实例是不是已保留过或
是不是须要新建立实例了:

// 将对象存入hash 纪录中,对峙一个援用指向它
Model.include({
save: function(){
this.newRecord ? this.create() : this.update();
}
});

用来依据ID 查找资本的find() 函数:

Model.extend({
// 经由过程ID 查找,找不到则抛出非常
find: function(id){
return this.records[id] || throw("Unknown record");
}
});

如今已成功地建立了一个基础的ORM,运转一下:

var asset = Asset.init();
asset.name = "same, same";
asset.id = 1
asset.save();
var asset2 = Asset.init();
asset2.name = "but different";
asset2.id = 2;
asset2.save();
assertEqual( Asset.find(1).name, "same, same" );
asset2.destroy();

增添 ID 支撑

此时每次保留一条纪录都必须手动指定一个ID。能够到场自动化处置惩罚。起首,我们须要一个要领来自动天生ID,能够运用全局一致标识(Globally UniqueIdentifier,简称GUID)天生器来做这一步。从手艺的角度讲,出于API 的缘由,Javascript 没法友爱正式地天生128 位的GUID,它只能天生伪随机数。虽然Javascript 中内置的Math.random() 要领只管发生的是伪随机数,但也充足用了。

Robert Kieffer 写了一个简单明了的GUID 天生器,它运用Math.random() 来发生一个伪
随机数的GUID(http://goo.gl/0b0hu),代码也很简单:

Math.guid = function(){
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
return v.toString(16);
}).toUpperCase();
};

如今有了天生GUID 的要领,能够很轻易将它集成到ORM 里,剩下的只需修正
create() 函数了:

Model.extend({
create: function(){
if ( !this.id )
this.id = Math.guid();
this.newRecord = false;
this.parent.records[this.id] = this;
}
});

如许任何新建立的纪录都包括一个随机的GUID 作为它们的ID :

var asset = Asset.init();
asset.save();
asset.id //=> "54E52592-313E-4F8B-869B-58D61F00DC74"

寻址援用

现在建立的ORM 中存在一个与援用相干的bug。当保留或
经由过程find() 查找纪录时,所返回的实例并没有复制一份,因而对任何属性的修正都邑影
响原始资本。革新:

var asset = new Asset({name: "foo"});
asset.save();
// 准确传入资本
assertEqual( Asset.find(asset.id).name, "foo" );
// 变动属性,而没有挪用update()
asset.name = "wem";
// 出题目了,由于asset 的名字被修正为“wem”
assertEqual( Asset.find(asset.id).name, "foo" );

须要修复这个题目,在实行find() 操纵的时刻新建立一个对象,同样在建立或更新
纪录的时刻须要复制对象:

Asset.extend({
find: function(id){
var record = this.records[id];
if ( !record ) throw("Unknown record");
return record.dup();
}
});
Asset.include({
create: function(){
this.newRecord = false;
this.parent.records[this.id] = this.dup();
},
update: function(){
this.parent.records[this.id] = this.dup();
},
dup: function(){
return jQuery.extend(true, {}, this);
}
});

这里存在别的一个题目,Model.records 是被一切模子所同享的对象:

assertEqual( Asset.records, Person.records );

但这在兼并一切的纪录时会有副作用:

var asset = Asset.init();
asset.save();
assert( asset in Person.records );

解决办法是在建立新的模子时设置一个新的records 对象。Model.create() 是建立新对
象的回调,因而我们能够设置恣意形貌这个模子的对象:

Model.extend({
created: function(){
this.records = {};
}
});

【公然纪录进修JS MVC,不知道能对峙多久= =。以《基于MVC的Javascript web富运用开辟》为重要进修材料。】


推荐阅读
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • 随着前端技术的发展,越来越多的开发者开始使用react、vue等web框架,但很少有人深入理解这些框架的源码。然而,这些框架底层都是由原生的javascript构建而成。对于初学前端的人来说,可能会认为javascript很容易上手,但实际上只是因为它被高度封装了。与能够使用封装类的人相比,能够理解框架原理的人则处于另一个层面。本文将深入剖析jquery源码,探寻框架底层的原理,帮助读者更好地理解web框架的运行机制。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • Node.js学习笔记(一)package.json及cnpm
    本文介绍了Node.js中包的概念,以及如何使用包来统一管理具有相互依赖关系的模块。同时还介绍了NPM(Node Package Manager)的基本介绍和使用方法,以及如何通过NPM下载第三方模块。 ... [详细]
  • 本文介绍了在满足特定条件时如何在输入字段中使用默认值的方法和相应的代码。当输入字段填充100或更多的金额时,使用50作为默认值;当输入字段填充有-20或更多(负数)时,使用-10作为默认值。文章还提供了相关的JavaScript和Jquery代码,用于动态地根据条件使用默认值。 ... [详细]
  • 如何压缩网站页面以减少页面加载时间
    本文介绍了影响网站打开时间的两个因素,即网页加载速度和网站页面大小。重点讲解了如何通过压缩网站页面来减少页面加载时间。具体包括图片压缩、Javascript压缩、CSS压缩和HTML压缩等方法,并推荐了相应的压缩工具。此外,还提到了一款Google Chrome插件——网页加载速度分析工具Speed Tracer。 ... [详细]
author-avatar
陶磊2922_502
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有