寻址引用

源代码现存的问题:当保存或通过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. C语言中的struct和typedef struct<转载>

    原文:http://www.nowamagic.net/librarys/veda/detail/1785 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.这里的数据类型包括内部数 ...

  2. Android如何在java代码中设置margin

    习惯了直接在xml里设置margin(距离上下左右都是10dip),如: <ImageView android:layout_margin="10dip" android:s ...

  3. [Effective JavaScript 笔记]第5章:数组和字典--个人总结

    前言 这节里其实一直都在讨论对象这个在js中的万能的数据结构.对象可以表式为多种的形式,表示为字典和数组之间的区别.更多的我觉得这章讨论多的是一些对应实现功能的相关操作,有可能出现的bug以及如何避免 ...

  4. 从零开始写一个武侠冒险游戏-8-用GPU提升性能(3)

    从零开始写一个武侠冒险游戏-8-用GPU提升性能(3) ----解决因绘制雷达图导致的帧速下降问题 作者:FreeBlues 修订记录 2016.06.23 初稿完成. 2016.08.07 增加对 ...

  5. android 自定义Dialog背景透明及显示位置设置

    先贴一下显示效果图,仅作参考: 代码如下: 1.自定义Dialog public class SelectDialog extends AlertDialog{ public SelectDialog ...

  6. python遍历数组的两种方法

    第一种,最常用的,通过for in遍历数组 1 2 3 4 5 6 7 8 colours = ["red","green","blue"] ...

  7. MongoDB 学习笔记(python操作)

    转自: http://blog.csdn.net/daillo/article/details/7030910

  8. python中的引用

    作为一个python初学者,今天被一个python列表和词典引用的问题折磨了很久,但其实了解了缘由也很简单,记录在此备忘. 首先背书python中的引用对象问题: 1. python不允许程序员选择采 ...

  9. Android 中的异步下载

    网上提到最多的就是利用AsyncTask进行异步下载,用android-async-http第三方库的也比较多.这里写点注意事项. 先说说android-async-http,这个库发送请求利用thr ...

  10. (转)JAVA AJAX教程第一章-初始AJAX

    既然是认识AJAX,理论和实践相结合,这样让自己学的更快,理解更深入,我分一下几点: 1.  认识传统的同步交互方式和AJAX解决方案 2.  AJAX使用到的技术 3.  实例体验AJAX 一.同步 ...