emberjs学习二(ember-data和localstorage_adapter)

准备工作

首先我们加入ember-dataember-localstorage-adapter两个依赖项,使用bower install安装这两个插件。如下

"dependencies": {
"jquery": "~1.9.1",
"ember": "~1.13.10",
"handlebars":"~1.3.0",
"ember-data":"~1.13.11",
"ember-localstorage-adapter":"latest"
}

然后就可以开始我们今天的例子了,我们今天要做的事情和【初学emberjs】并没有太多的不一样,只是之前的数据源采用的数组,而且数据在刷新后就没了,而今天要做的就是把数组换成emberjs的数据模型,然后保存到localstorage中,所以预览效果的话要浏览器支持localstorage.

ok,还是新建一个.html页面和一个app.js文件,然后在html中引入js

<script type="text/javascript" src="../../bower_components/jquery/jquery.min.js"></script>
<script type="text/javascript" src="../../bower_components/handlebars/handlebars.min.js"></script>
<script type="text/javascript" src="../../bower_components/ember/ember-template-compiler.js"></script>
<script type="text/javascript" src="../../bower_components/ember/ember.min.js"></script>
<script type="text/javascript" src="../../bower_components/ember-data/ember-data.min.js"></script>
<script type="text/javascript" src="../../bower_components/ember-localstorage-adapter/localstorage_adapter.js"></script>
<script type="text/javascript" src="js/app.js"></script>

这里比之前多引用了ember-datalocalstorage_adapter

我们试想的场景还是一个初始的列表,然后我们对它进行增删改,这些改动都同步到本地,刷新也存在。我们先把列表显示出来:

<script type="text/x-handlebars" id="index">
<ol>
{{#each model}}
<li>{{title}} <button {{action "del"}}>删除</button></li>
{{/each}}
</ol>
{{outlet}}
</script>

然后我们在index的Route中返回一个store.

App.IndexRoute = Ember.Route.extend({
model: function() {
return this.store.find('test');
}
});

它的意思是在store里查找一个命名空间叫test的数据对象模型,它里面有一个content的属性,就是对应的数据集了,所以在上面的each中我们可以{{#each content}}或者{{#each controller}}(不推荐).

一开始是没有数据的,我们再上面的模板里再加一个输入框和一个添加按钮:

{{input value=title}}
<button {{action "add"}}>添加</button>

这里的input绑定了一个title的属性,老的写法是valueBinding="title",但新版似乎并不推荐这么写了,这个title就对应到了controller里的属性了,button上加了一个add的action.

App.IndexController = Ember.ArrayController.extend({
title:null,
actions:{
add:function(){
}
});

好,我们还要为刚才的store注册一个适配器,emberjs有一个默认的适配器RESTAdapter,它是用为提交网络请求的,就是在你增删改的时候都会向服务器提交ajax返回json,但这次我们并不需要它,我们要用到的是ember-localstorage-adapter

/** Ember Data **/
App.Test = DS.Model.extend({
title: DS.attr('string'),
desc: DS.attr('string')
});
App.ApplicationAdapter = DS.LSAdapter.extend({
namespace: 'test'
});

这里我们建了一个有两个字段的模型,然后加了一个命名空间叫test的适配器,好,我们接着actions的add操作编写代码,要新增一条记录可以使用store.createRecord方法。

actions:{
add:function(){
console.log(this.get('content'))
console.log(this.get('title'))
var newRecord= this.store.createRecord('test');
newRecord.set('title',this.get('title'));
newRecord.save();
}
}

我们在test创建一个记录,然后set它的值,这里还有另外一种写法,就是使用createRecord的第二参数,传入新增的对象

var newRecord= this.store.createRecord('test',{
title:this.get('title')
});

打开网页,我们试下效果

然后我们按照上节的例子加入删除的action

del:function(record){
this.store.deleteRecord(r);
r.save();
}

修改的操作和【初学emberjs】里的类似,这里就不重复贴了,我会在后面的源码中加入这个代码功能。

        update: function() {
var content = this.get('content');
content.save();
}
App.InfoRoute = Ember.Route.extend({
model: function(arg) {
console.log(arg)
return this.store.find('test', arg.id);
}
});

本文的源码地址:https://github.com/tianxiangbing/emberjs-test/tree/master/example/test2

本文的demo案例地址:http://www.lovewebgames.com/emberjs/example/test2/index.html

emberjs学习二(ember-data和localstorage_adapter)的更多相关文章

  1. emberjs学习一(环境和第一个例子)

    code { margin: 0; padding: 0; white-space: pre; border: none; background: transparent; } code, pre t ...

  2. ReactJS入门学习二

    ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...

  3. Hbase深入学习(二) 安装hbase

    Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ...

  4. SpringCloud学习(二):微服务入门实战项目搭建

    一.开始使用Spring Cloud实战微服务 1.SpringCloud是什么? 云计算的解决方案?不是 SpringCloud是一个在SpringBoot的基础上构建的一个快速构建分布式系统的工具 ...

  5. DjangoRestFramework学习二之序列化组件、视图组件 serializer modelserializer

      DjangoRestFramework学习二之序列化组件.视图组件   本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组 ...

  6. SpringMVC入门学习(二)

    SpringMVC入门学习(二) ssm框架 springMVC  在上一篇博客中,我简单介绍了一下SpringMVC的环境配置,和简单的使用,今天我们将进一步的学习下Springmvc的操作. mo ...

  7. day 82 Vue学习二之vue结合项目简单使用、this指向问题

    Vue学习二之vue结合项目简单使用.this指向问题   本节目录 一 阶段性项目流程梳理 二 vue切换图片 三 vue中使用ajax 四 vue实现音乐播放器 五 vue的计算属性和监听器 六 ...

  8. 标准Trie字典树学习二:Java实现方式之一

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! 系列文章: 1. 标准Trie字典树学习一:原理解析 2.标准T ...

  9. day 90 DjangoRestFramework学习二之序列化组件

      DjangoRestFramework学习二之序列化组件   本节目录 一 序列化组件 二 xxx 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组件 首先按照 ...

随机推荐

  1. Floyd算法(三)之 Java详解

    前面分别通过C和C++实现了弗洛伊德算法,本文介绍弗洛伊德算法的Java实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3. 弗洛伊德算法的代码说明 4. 弗洛伊德算法的源码 转载请注明 ...

  2. Floyd算法(一)之 C语言详解

    本章介绍弗洛伊德算法.和以往一样,本文会先对弗洛伊德算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3 ...

  3. [Qt5] How to connect c++ with QML

    Qt5处于过度阶段,架构繁琐,学习成本不低.尤其是UI代码竟然被重写,变了天. Qt中的c++可能是连接OPENCV与QML的一个不错的桥梁,在此学习这部分实用的技术. Reference: http ...

  4. Android基于mAppWidget实现手绘地图(十二)–显示当前用户位置

    若显示当前用户位置,你需要执行以下步骤: 1.添加ACCESS_COARSE_LOCATION 和ACCESS_FINE_LOCATION权限在AndroidManifest.xml中 2.用mapW ...

  5. [转载]基于TFS实践敏捷-实现用户场景

    您是新用户的 Visual Studio 应用程序生命周期管理 (ALM) 和 Team Foundation Server (TFS) 吗? 您想知道如何您和您的团队可以获得最大受益的这些工具来生成 ...

  6. vs切换当前编辑文件时自动定位目录树

    在编辑区,切换当前编辑文件时(单击.cpp或.h文件选项卡),"解决方案资源管理器"目录树会自动定位当前编辑的文件,并以灰色标识,当一个解决方案中的工程数目数目很多,每个工程下面又 ...

  7. Linux - 日志文件

    Linux日志文件绝大多数存放在/var/log目录,其中一些日志文件由应用程序创建,其他的则通过syslog来创建. Linux系统日志文件通过syslog守护程序在syslog套接字/dev/lo ...

  8. JavaScript及兼容性笔记

    1. Json to String JSON.stringify(jsonobj)//(IE8+,Chrome 1+,FF 3+) //参考 http://www.nowamagic.net/libr ...

  9. 20 个高质量响应式的 HTML/CSS 网站模板

    BisLite: Free HTML Website Templates Professional Responsive HTML5/CSS3 template Respond Wood workin ...

  10. C++ - unordered_map 源码解析

    转自:http://zrj.me/archives/1248,转载请注明.(分析得不错) 主要尝试回答下面几个问题: 一般情况下,使用 hash 结构,需要有桶的概念,那么 unordered_map ...