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快速入门之安全策 ...
随机推荐
- 漫长Appium之路(二)——Appium安装与使用总结
前面介绍了iOS自动化工具的Appium所需的虚拟机环境,接下来介绍下Appium的安装与使用方法,这个足足折腾我将近一个星期.网上没有什么详细的资料,对于遇到的各种各样问题也没用提供明确的解决方法. ...
- E. Tetrahedron(数学推导)
E. Tetrahedron 分类: AC路漫漫2013-08-08 16:07 465人阅读 评论(0) 收藏 举报 time limit per test 2 seconds memory lim ...
- 淘宝(阿里百川)手机客户端开发日记第六篇 Service详解(二)
DEMO1:当我们点击启动服务时和点击停止服务的时候,观察服务的运行状态,布局由于简单,只是两个普通的Button按钮,在此我只上截图. java代码部分 第一步:我们需要实现一个服务类,继承自ser ...
- NGUI之scroll view制作,以及踩的坑总结
http://blog.csdn.net/monzart7an/article/details/23878505 链接: http://game.ceeger.com/forum/read.php?t ...
- unity3d webplayer 16:9 居中显示模板
原地址:http://www.cnblogs.com/88999660/archive/2013/04/12/3016773.html <!DOCTYPE html PUBLIC "- ...
- ubuntu14.04安装chrome
到https://www.google.com/chrome/browser/desktop/index.html可下载指定版本的deb文件. 32bit: wget https://dl.googl ...
- 中石油-高精度阶乘-java
问题 F: [高精度]高精度阶乘 时间限制: 1 Sec 内存限制: 64 MB提交: 49 解决: 13[提交][状态][讨论版] 题目描述 <魔法宝典>对于修罗王是如此重要,是因为 ...
- EZ的间谍网络(codevs 4093)
由于外国间谍的大量渗入,学校安全正处于高度的危机之中.YJY决定挺身而作出反抗.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手 ...
- Txx考试(codevs 2894)
2894 Txx考试 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description Txx是一个成绩很差的人,考 ...
- 使用webstorm调试node程序
前言 相信大家接触过不少node代码了,如果你应用的比较初级或者针对你的项目不需要接触过深的node代码,也许你仅仅需要简单的console.log('your variable')就完全满足你的需要 ...