英文原版: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(租赁信息)的数据结构。
为了使用我们新定义的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,并且让真实服务器来与存储数据和检索数据。