寻址引用

源代码现存的问题:当保存或通过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)的更多相关文章

  1. Asp.net MVC 4 模型的数据注释

    [Bind(…)] Lists fields to exclude or include when binding parameter or form values to model properti ...

  2. ASP.NET MVC 模型和数据对象映射实践

    在使用 MVC 开发项目的过程中遇到了个问题,就是模型和数据实体之间的如何快捷的转换?是不是可以像 Entity Framework 的那样 EntityTypeConfiguration,或者只需要 ...

  3. ASP.NET MVC 5 学习教程:通过控制器访问模型的数据

    原文 ASP.NET MVC 5 学习教程:通过控制器访问模型的数据 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连 ...

  4. 【译】ASP.NET MVC 5 教程 - 6:通过控制器访问模型的数据

    原文:[译]ASP.NET MVC 5 教程 - 6:通过控制器访问模型的数据 在本节中,你将新建一个MoviesController 类,并编写获取电影数据的代码,使用视图模板将数据展示在浏览器中. ...

  5. ASP.NET MVC数组模型绑定

    在ASP.NET MVC中使用Razor语法可以在视图中方便地展示数组,如果要进行数组模型绑定,会遇到索引断裂问题,如下示例: <input type="text" name ...

  6. .net的WebForm模拟MVC进行模型绑定,让自己少操劳

    一.前言 用过MVC的兄弟们都知道,MVC有模型绑定表单提交的数据功能,那么我也想偷个懒也写个WebForm版的模型绑定.这里主要定义一个泛型方法,然后通过反射把表单上对应属性名字的值赋值到反射创建类 ...

  7. MVC数组模型绑定

    ASP.NET MVC数组模型绑定   在ASP.NET MVC中使用Razor语法可以在视图中方便地展示数组,如果要进行数组模型绑定,会遇到索引断裂问题,如下示例: <input type=& ...

  8. MVC 编程模型及其变种

    MVC 编程模型及其变种 MVC全称是Model View Controller, 这是一个模型(model)-查看(view)-调节器(controller)缩写,这是通过通用的编程模型非.MVC当 ...

  9. MVC编程模型

    MVC 编程模型 MVC 是三个 ASP.NET 开发模型之一. MVC 是用于构建 web 应用程序的一种框架,使用 MVC (Model View Controller) 设计: Model(模型 ...

  10. 【第二篇】ASP.NET MVC快速入门之数据注解(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

随机推荐

  1. Asp.net面试题

    Asp.net核心技术思想 1.概述反射和序列化 反射:程序集包含模块,而模块包含类型,类型又包含成员.反射则提供了封装程序集.模块和类型的对象.您可以使用反射动态地创建类型的实例,将类型绑定到现有对 ...

  2. MySQL的分页

    有朋友问: MySQL的分页似乎一直是个问题,有什么优化方法吗?网上看到网上推荐了一些分页方法,但似乎不太可行,你能点评一下吗? 方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL ...

  3. POJ 2492 并查集扩展(判断同性恋问题)

    G - A Bug's Life Time Limit:10000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u S ...

  4. ASP.NET 画图与图像处理-如何直接输出到页面

    有时候我们生成的图片并不需要保存到磁盘中,而是直接输出到页面,比如验证码.实时报表等,如何做呢?请参考如下:     protected void Page_Load(object sender, E ...

  5. linux screen 命令详解(未验证+研究)

    一.背景 系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份.ftp 传输等等.通常情况下我们都是为每一个这样的任务开一个远 ...

  6. linux下proc里关于磁盘性能的参数

    我 们在磁盘写操作持续繁忙的服务器上曾经碰到一个特殊的性能问题.每隔 30 秒,服务器就会遇到磁盘写活动高峰,导致请求处理延迟非常大(超过3秒).后来上网查了一下资料,通过调整内核参数,将写活动的高峰 ...

  7. Java for LeetCode 051 N-Queens

    Given an integer n, return all distinct solutions to the n-queens puzzle. Each solution contains a d ...

  8. Android拼图游戏

    效果如下 游戏的设计 首先我们分析下如何设计这款游戏: 1.我们需要一个容器,可以放这些图片的块块,为了方便,我们准备使用RelativeLayout配合addRule实现 2.每个图片的块块,我们准 ...

  9. kvm xxx.xml文件的位置

    /var/run/libvirt/qemu/xxx.xml /etc/libvirt/qemu/xxx.xml

  10. 深入浅出TCP协议的三次握手过程

    TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 每一次TCP连接都需要三个阶段:连接建立.数据传送和连接释放.“三次握手”就发生在连接建立阶段. 1.三次握手( ...