mvc-3模型和数据(2)
寻址引用
源代码现存的问题:当保存或通过find()查找记录时,所返回的实例并没有复制一份,因此对任何属性的修改都会影响原始资源;这里我们只想当调用update()方法时才会修改资源
//由于Model.records时所有模型所共享的,所以在创建新的模型时设置一个新的records对象;
Model.extend({
created: function() {
this.records = {};
}
});
var Asset = Model.create();
//添加到的是每个类对象里,所有不共享
//在执行find时创建一个对象,同样在创建或更新记录时需要复制对象;
Asset.extend({
find: function(id) {
var record = this.records[id];
if(!record) throw("Unknow record");
return record.dup();
}
});
//添加到的是每个类对象的prototype属性里,所有该类init的'实例'共享
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);
}
});
var asset = Asset.init({name: 'foo'});
asset.save();
console.log(Asset.find(asset.id));
asset.name="new";
console.log(Asset.find(asset.id));
asset.update();
console.log(Asset.find(asset.id));
转载数据
数据的预加载:如
- 一个可翻页列表的时候,预加载下一页的数据
- 长列表的时候,当滚动到一定位置就自动加载并插入数据
加载数据方式
- 直接嵌套显示在初始页面
- 通过Ajax或Jsonp的方式用单独的HTTP请求加载数据
直接嵌套数据
- 推荐只在数据量少的时候使用
通过Ajac载入数据
同源策略限制:因为当一个Ajax请求被发送时,所有的请求都会附带主域的cookie信息一起发送;所有如果请求是来自域登录后的用户,没有同源策略限制,攻击者就可能获取你的重要信息
JSONP
原理是通过创建一个script标签,所辖的外部文件包含一段JSONP数据,数据是由服务器返回的,作为参数包装在一个函数调用中
//指向一个远程服务
<script src="http://example.com/data.json"></script>
//请求文件中包含json对象
jsonCallback({"data": "foo"});
//本地s设置运行
window.jsonCallback = function(rest) {
//....
}
向ORM中添加记录
从服务器抓取记录并更新模型记录
Model.extend({
populate: function(values) {
this.records = {};
for(var i = 0, l = values.length; i < l; i++) {
var record = this.init(values[i]);
record.newRecord = false;
this.records[record.id] = record;
}
}
});
//请求数据
jQuery.getJSON("/assets", function(result) {
Asset.populate(result);
});
本地存储数据
方法
- localStorage["someData"] = "wen"; //设置一个值
- var itemsStored = localStorage.length; //获取个数
- localStorage.setItem("someData", "wem") //设置一个项(一种hash写法)
- localStorage.getItem("someData"); //获取一个项,不存在返回null;
- localStorage.removeItem("someData"); //删除一个项,不存在返回null;
- localStorage.clear(); //清空本地储存;
数据类型的处理
由于保存的都是字符串,如果要保存数字或对象,必须自己转化类型;
如果使用json,需要储存的时候将对象序列化,取出的时候再转化
var object = {some: "object"};
localStorage.setItem("seriData", JSON.stringify(object));
var result = JSON.parse(localStorage.getItem("SeriData"));
给ORM添加本地存储
//为了实现本地存储,首先判断哪些属性需要序列化;
Model.extend({
created: function() {
this.records = {};
this.attributes = [];
}
});
Model.include({
//创建attributes函数用以返回包含属性到值的映射的对象;
attributes: function() {
var result = {};
for(var i in this.parent.attributes) {
var attr = this.parent.attributes[i];
result[attr] = this[attr];
}
result.id = this.id;
return result;
},
toJSON: function() {
return (this.attributes());
}
});
//增加两个方法,当保存数据的时候,Model.records对象将转化为数组,做序列化并储存到本地
Model.LocalStorage = {
saveLocal: function(name) {
var result = [];
for(var i in this.records) {
result.push(this.records[i])
}
localStorage[name] = JSON.stringify(result);
},
localLocal: function(name) {
var result = JSON.parse(localStorage[name]);
this.populate(result);
}
};
var Person = Model.create();
Person.extend(Model.LocalStorage);
Person.attributes = ["name", "ext"];
var jinks = Person.init({name: "jinks", age:24});
jinks.save();
var bob = Person.init({name: "bob", age:24});
bob.save();
var json = JSON.stringify(Person.records);
console.log(jinks.attributes(), json);
Person.saveLocal("user");
将新纪录提交给服务器
Model.include({
createRemote: function(url, callback) {
$.post(url, this.attributes(), callback);
},
updateRemote: function(url, callback) {
$.ajax({
url: url,
data: this.attributes(),
success: callback,
type: "PUT"
})
}
})
var Person = Model.create();
Person.init({name: "json.text"}).createRemote("/assets");
mvc-3模型和数据(2)的更多相关文章
- Asp.net MVC 4 模型的数据注释
[Bind(…)] Lists fields to exclude or include when binding parameter or form values to model properti ...
- ASP.NET MVC 模型和数据对象映射实践
在使用 MVC 开发项目的过程中遇到了个问题,就是模型和数据实体之间的如何快捷的转换?是不是可以像 Entity Framework 的那样 EntityTypeConfiguration,或者只需要 ...
- ASP.NET MVC 5 学习教程:通过控制器访问模型的数据
原文 ASP.NET MVC 5 学习教程:通过控制器访问模型的数据 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连 ...
- 【译】ASP.NET MVC 5 教程 - 6:通过控制器访问模型的数据
原文:[译]ASP.NET MVC 5 教程 - 6:通过控制器访问模型的数据 在本节中,你将新建一个MoviesController 类,并编写获取电影数据的代码,使用视图模板将数据展示在浏览器中. ...
- ASP.NET MVC数组模型绑定
在ASP.NET MVC中使用Razor语法可以在视图中方便地展示数组,如果要进行数组模型绑定,会遇到索引断裂问题,如下示例: <input type="text" name ...
- .net的WebForm模拟MVC进行模型绑定,让自己少操劳
一.前言 用过MVC的兄弟们都知道,MVC有模型绑定表单提交的数据功能,那么我也想偷个懒也写个WebForm版的模型绑定.这里主要定义一个泛型方法,然后通过反射把表单上对应属性名字的值赋值到反射创建类 ...
- MVC数组模型绑定
ASP.NET MVC数组模型绑定 在ASP.NET MVC中使用Razor语法可以在视图中方便地展示数组,如果要进行数组模型绑定,会遇到索引断裂问题,如下示例: <input type=& ...
- MVC 编程模型及其变种
MVC 编程模型及其变种 MVC全称是Model View Controller, 这是一个模型(model)-查看(view)-调节器(controller)缩写,这是通过通用的编程模型非.MVC当 ...
- MVC编程模型
MVC 编程模型 MVC 是三个 ASP.NET 开发模型之一. MVC 是用于构建 web 应用程序的一种框架,使用 MVC (Model View Controller) 设计: Model(模型 ...
- 【第二篇】ASP.NET MVC快速入门之数据注解(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
随机推荐
- Asp.net面试题
Asp.net核心技术思想 1.概述反射和序列化 反射:程序集包含模块,而模块包含类型,类型又包含成员.反射则提供了封装程序集.模块和类型的对象.您可以使用反射动态地创建类型的实例,将类型绑定到现有对 ...
- MySQL的分页
有朋友问: MySQL的分页似乎一直是个问题,有什么优化方法吗?网上看到网上推荐了一些分页方法,但似乎不太可行,你能点评一下吗? 方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL ...
- POJ 2492 并查集扩展(判断同性恋问题)
G - A Bug's Life Time Limit:10000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u S ...
- ASP.NET 画图与图像处理-如何直接输出到页面
有时候我们生成的图片并不需要保存到磁盘中,而是直接输出到页面,比如验证码.实时报表等,如何做呢?请参考如下: protected void Page_Load(object sender, E ...
- linux screen 命令详解(未验证+研究)
一.背景 系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份.ftp 传输等等.通常情况下我们都是为每一个这样的任务开一个远 ...
- linux下proc里关于磁盘性能的参数
我 们在磁盘写操作持续繁忙的服务器上曾经碰到一个特殊的性能问题.每隔 30 秒,服务器就会遇到磁盘写活动高峰,导致请求处理延迟非常大(超过3秒).后来上网查了一下资料,通过调整内核参数,将写活动的高峰 ...
- Java for LeetCode 051 N-Queens
Given an integer n, return all distinct solutions to the n-queens puzzle. Each solution contains a d ...
- Android拼图游戏
效果如下 游戏的设计 首先我们分析下如何设计这款游戏: 1.我们需要一个容器,可以放这些图片的块块,为了方便,我们准备使用RelativeLayout配合addRule实现 2.每个图片的块块,我们准 ...
- kvm xxx.xml文件的位置
/var/run/libvirt/qemu/xxx.xml /etc/libvirt/qemu/xxx.xml
- 深入浅出TCP协议的三次握手过程
TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 每一次TCP连接都需要三个阶段:连接建立.数据传送和连接释放.“三次握手”就发生在连接建立阶段. 1.三次握手( ...