Ember旅程系列(八) -- 使用Ember Data

卢知
2023-12-01

英文原版:https://guides.emberjs.com/v2.13.0/tutorial/ember-data/

截止到本章前,我们的app依然使用着定义在rentals路由模板中的硬编码租赁信息。为了能适应应用的不断增长,我们要考虑从远程服务器来动态的获取这些数据。并且要更进一步的增加应用使用时的灵活性,比如:根据条件筛选租赁信息。

Ember集成了一个叫 Ember Data 的数据管理支持库,可以帮助我们完成远程数据的请求。

使用Ember Data时,需要按照它的要求,通过继承DS.Model来定义你所需要的数据的结构。

同样地,Ember Data Model也可以通过Ember CLI命令来生成。我们在此就直接使用该命令来生成我们的rental模型:

ember g model rental

输出:

installing model
  create app/models/rental.js
installing model-test
  create tests/unit/models/rental-test.js

打开该model文件,我们暂时会看到一个空的类定义:

app/models/rental.js

import DS from 'ember-data';

export default DS.Model.extend({

});

现在,我们来定义rental的数据结构。该数据结构的定义,需要使用与实际数据相同的属性名。回顾下之前硬编码在rentals路由模板之中的返回数据,那么就容易明白,我们需要定义哪些属性:title, owner, city, property type, image, bedrooms 和 description. 让我们先给每个定义的属性一个值:DS.attr()。 这个方法暂时不用关注,当然如果你对此好奇,可以去阅读本旅程系列文章中的属性定义一节。

app/models/rental.js

import DS from 'ember-data';

export default DS.Model.extend({
  title: DS.attr(),
  owner: DS.attr(),
  city: DS.attr(),
  propertyType: DS.attr(),
  image: DS.attr(),
  bedrooms: DS.attr(),
  description: DS.attr()
});

好了,我们现在有了一个Ember Data的实现。并且它描述了rental(租赁信息)的数据结构。

更新Model()钩子函数

为了使用我们新定义的Ember Data Model对象,我们需要更新我们之前定义的rentals路由处理程序中的model()钩子函数。删除掉硬编码的javascript数组,并且用一个对Ember Data Store Service的调用替代。Store Service会被注入到Ember中所有的路由和组件里。这将会是一个主要的与Ember Data实现交互的接口。现在,让我调用store service的findAll方法,并且传入刚创建的rental模型的类名:

app/routes/rentals.js

import Ember from 'ember';

export default Ember.Route.extend({
  model() {
    return this.get('store').findAll('rental');
    /*
    return [{
      id: 'grand-old-mansion',
      title: 'Grand Old Mansion',
      owner: 'Veruca Salt',
      city: 'San Francisco',
      propertyType: 'Estate',
      bedrooms: 15,
      image: 'https://upload.wikimedia.org/wikipedia/commons/c/cb/Crane_estate_(5).jpg',
      description: "This grand old mansion sits on over 100 acres of rolling hills and dense redwood forests."
    }, {
      id: 'urban-living',
      title: 'Urban Living',
      owner: 'Mike TV',
      city: 'Seattle',
      propertyType: 'Condo',
      bedrooms: 1,
      image: 'https://upload.wikimedia.org/wikipedia/commons/0/0e/Alfonso_13_Highrise_Tegucigalpa.jpg',
      description: "A commuters dream. This rental is within walking distance of 2 bus stops and the Metro."
    }, {
      id: 'downtown-charm',
      title: 'Downtown Charm',
      owner: 'Violet Beauregarde',
      city: 'Portland',
      propertyType: 'Apartment',
      bedrooms: 3,
      image: 'https://upload.wikimedia.org/wikipedia/commons/f/f7/Wheeldon_Apartment_Building_-_Portland_Oregon.jpg',
      description: "Convenience is at your doorstep with this charming downtown rental. Great restaurants and active night life are within a few feet."
    }];
    */
  }
});

当你调用findAll()时,Ember Data将会试图从”/api/rentals”这个url下获取数据。请不要忘了,我们之前创建了一个adapter(适配器),并设置了名称空间”/api”用来指定发送请求的url前缀。

你可以通过阅读Models section(暂未翻译)来更深入的了解Ember Data。

一旦我们在开发环境中配置好了Ember Mirage,我们就可以通过Mirage来模拟网络请求,并返回我们想要的数据。

当我们要把app部署到生产服务器上时,我们会希望用一个真实的远程服务器来代替Mirage,并且让真实服务器来与存储数据和检索数据。

 类似资料: