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快速入门之安全策 ...
随机推荐
- avalon框架,简单的MVVM
今天我又要挑战一次一个高大上的公司了 但是看着jd有点忧伤了要求如下 基本要求:1.熟悉 HTML / CSS / JS 并有良好的代码风格:2.理解 Web 标准,语义化,可以解决主流浏览器及不同版 ...
- C++编程思想重点笔记(上)
C和C++指针的最重要的区别在于:C++是一种类型要求更强的语言.就void *而言,这一点表现得更加突出.C虽然不允许随便地把一个类型的指针指派给另一个类型,但允许通过void *来实现.例如: b ...
- Asp.net面试题
Asp.net核心技术思想 1.概述反射和序列化 反射:程序集包含模块,而模块包含类型,类型又包含成员.反射则提供了封装程序集.模块和类型的对象.您可以使用反射动态地创建类型的实例,将类型绑定到现有对 ...
- cocos代码研究(1)sprite学习笔记
各种方法创建Sprite和Animate //图片创建法 参数一:图片资源路径 参数二:Rect选区 auto sprite = Sprite::create(, )); addChild(sprit ...
- PHP常量PHP_SAPI与函数php_sapi_name()简介,PHP运行环境检测
php_sapi_name() 是用来检测PHP运行环境的函数. 该函数返回一个描述PHP与WEB服务器接口的小写字符串. 例如:aolserver, apache,apache2filter, ap ...
- [Effective JavaScript 笔记]第60条:支持方法链
无状态的API的部分能力是将复杂操作分解为更小的操作的灵活性.一个很好的例子是字符串的replace方法.由于结果本身也是字符串,可以对前一个replace操作重复执行替换.这种模式的一个常见用例是在 ...
- unity3d进行脚本资源打包加载
原地址:http://www.cnblogs.com/hisiqi/p/3204752.html 本文记录如何通过unity3d进行脚本资源打包加载 1.创建TestDll.cs文件 public c ...
- Linux jstack命令详解
jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息. 如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack ...
- 【Python】Django支持事务方式
代码: with transaction.atomic(): for i in xrange(int(svc_instance_num)): tmp_fileprotect_svc_instance ...
- 【OpenStack】OpenStack系列12之OpenStack自动化测试详解
参考文档: https://github.com/yongluo2013/osf-openstack-training/blob/master/installation/How-to-setup-op ...