×

EmberJS 教程

EmberJS 概述EmberJS 环境配置EmberJS 应用EmberJS 对象模型EmberJS 模板EmberJS 路由器EmberJS 组件EmberJS 模型EmberJS 视图EmberJS 控制器EmberJS 测试EmberJS 指定查询参数

Ember 对象模型

Ember 类的定义 初始化 继承Ember 类的扩展Ember 计算属性Ember 观察者Ember 数据绑定Ember 枚举Ember 第一章对象模型小结

Ember handlebars模板

Ember handlebars基础Ember handlebars条件表达式Ember handlebars遍历标签Ember handlebars显示对象键Ember handlebars属性绑定Ember {{link-to}} 助手Ember 路由 模板执行渲染顺序Ember {{action}} 助手Ember 表单元素Ember 调试助手Ember 工具类的助手Ember 第二章模板小结

Ember 路由

Ember 路由定义Ember 指定与路由关联的模型Ember 模板渲染Ember 路由重定向Ember 路由终止挑战和激活Ember loading error子路由Ember 查询参数Ember 异步路由

Ember 组件

Ember 组件定义Ember 属性传递Ember 包裹内容自定义包裹组件的HTML标签Ember 处理事件Ember action触发变化

Ember 控制器

Ember 控制器Ember 管理控制器的依赖关系

Ember 模型

Ember model简介Ember 定义模型Ember 记录查询Ember 新建、更新、删除记录Ember 设置记录到StoreEmber model的关联关系处理Ember 元数据Ember 自定义适配器Ember 自定义序列号器

Ember 测试

Ember 测试简介Ember 验收测试Ember 单元测试

Ember 记录查询


store提供了统一的获取数据的接口。包括创建新记录、修改记录、删除记录等,更多有关Store API请点击网址看详细信息。

为了演示这些方法的使用我们结合firebase,关于firebase与Ember的整合前面的文章已经介绍,就不过多介绍了。 做好准备工作:

ember g route articles
ember g route articles/article

1,查询方法findAll,findRecord,peekAll,peekRecord

首先配置route,修改子路由增加一个动态段article_id,有关动态的介绍请看Dynamic Segments

//  app/router.js

//  其他代码略写,

Router.map(function() {
  this.route('store-example');
  this.route('articles', function() {
    this.route('article', { path: '/:article_id' });
  });
});

下面是路由代码,这段代码直接调用Store的find方法,返回所有数据。

//  app/routes/articles.js
import Ember from 'ember';

export default Ember.Route.extend({
    model: function() {
    //  返回firebase数据库中的所有article
        return this.store.findAll('article');
    }
});

为了界面看起来舒服点我引入了bootstrap框架。引入的方式:bower install bootstrap安装插件。然后修改ember-cli-build.js,在return之前引入bootstrap:

app.import("bower_components/bootstrap/dist/js/bootstrap.js");
app.import("bower_components/bootstrap/dist/css/bootstrap.css");

重启项目使其生效。

下面是显示数据的模板articles.hbs


<div class="container">
    <div class="row">
        <div class="col-md-4 col-xs-4">
            <ul class="list-group">
            {{#each model as |item|}}
                <li class="list-group-item">

                    {{#link-to 'articles.article' item.id}}
                        {{item.title}}
                    {{/link-to}}
                </li>
            {{/each}}
            </ul>
        </div>

        <div class="col-md-8 col-xs-8">
        {{outlet}}
        </div>
    </div>
</div>

在浏览器运行:http://localhost:4200/articles/。稍等就可以看到显示的数据了,等待时间与你的网速有关。毕竟firebase不是在国内的!!!如果程序代码没有写错那么你会看到如下图的结果:

articles数据列表

但是右侧是空白的,下面点击任何一条数据,可以看到右侧什么都不显示! 下面在子模板中增加显示数据的代码:


<h1>{{model.title}}</h1>
<div class = "body">
{{model.body}}
</div>

在点击左侧的数据,右侧可以显示对应的数据了!但是这个怎么就显示出来了呢??其实 Ember 自动根据动态段过滤了,当然你也可以显示使用findRecord方法过滤。

//  app/routes/articles/article.js

import Ember from 'ember';

export default Ember.Route.extend({

    model: function(params) {
        console.log('params = ' + params.article_id);
        // 'chendequanroob@gmail.com'
        return this.store.findRecord('article', params.article_id);
    }
});

此时得到的结果与不调用findRecord方法是一致的。为了验证是不是执行了这个方法,我们把动态段params.article_id的值改成一个不存在的值’ ubuntuvim’,可以确保的是在我的firebase数据中不存在id为这个值的数据。此时控制台会出现下面的错误信息,从错误信息可以看出来是因为记录不存在的原因。

数据不存在错误

在上述的例子中,我们使用了findAll()方法和findRecord()方法,还有两个方法与这两个方法是类似的,分别是peekRecord()peekAll()方法。这两个方法的不同之处是不会发送请求,他们只会在本地缓存中获取数据。

下面分别修改articles.jsarticle.js这两个路由。使用peekRecord()peekAll()方法测试效果。

//  app/routes/articles.js

import Ember from 'ember';

export default Ember.Route.extend({
    model: function() {
        //  返回firebase数据库中的所有article
        // return this.store.findAll('article');

        return this.store.peekAll('article');
    }
});

由于没有发送请求,我也没有把数据存储到本地,所以这个调用什么数据都没有。

//  app/routes/articles/article.js

import Ember from 'ember';

export default Ember.Route.extend({

    model: function(params) {
        // return this.store.findRecord('article', params.article_id);

        return this.store.peekRecord('article', params.article_id);
    }
});

由于在父路由中调用findAll获取到数据并已经存储到Store中,所以可以用peekRecord()方法获取到数据。 但是在模型简介这篇文章介绍过Store的特性,当界面获取数据的时候首先会在Store中查询数据是否存在,如果不存在在再发送请求获取,所以感觉peekRecord()findRecord()方法区别不是很大!

2,查询多记录方法query()

项目中经常会遇到根据某个值查询出一组匹配的数据。此时返回的数据就不是只有一条了,那么Ember有是怎么去实现的呢?

//  app/routes/articles.js

import Ember from 'ember';

export default Ember.Route.extend({
    model: function() {
        //  返回firebase数据库中的所有article
        // return this.store.findAll('article');

        // return this.store.peekAll('article');

        //  使用query方法查询category为Java的数据
        return this.store.query('article', { filter: { category: 'java' } }).then(function(item) {
            //  对匹配的数据做处理
            return item;
        });
    }
});

查询categoryJava的数据。如果你只想精确查询到某一条数据可以使用queryRecord()方法。如下:

this.store.queryRecord('article', { filter: { id: ' -JzyT-VLEWdF6zY3CefO' } }).then(function(item) {
    //  对匹配的数据做处理
});

到此,常用的方法介绍完毕,希望通过介绍上述几个方法起到抛砖引玉的效果,有关于DS.Store类的还有很多很多的方法,使用方式都是类似的,更多方法请自己看API文档学习。


分类导航

关注微信下载离线手册

bootwiki移动版 bootwiki
(群号:472910771)