如何更有效地使用Ember中的适配器、序列化器、模型等工具?

How to use adapters, serializers, models and other tools in Ember more effectively?

我有一个基于 Ember 数据 的应用程序。我想弄清楚如何使代码更紧凑。我的应用程序看起来像这样:: 有几个来自 Express 服务器的端点。 在Ember应用程序中,每个端点对应于:适配器、序列化器、模型、路由、模板。一切正常,但是代码太繁琐了。我是 Ember 的新手,也许有一种方法可以更普遍地使用适配器和其他工具。以下是我的应用程序的一些部分,说明了它是如何工作的。

localhost:5000/api/cars

localhost:5000/api/vehicles

适配器“汽车”:

import RESTAdapter from '@ember-data/adapter/rest';
export default RESTAdapter.extend({
  host: http://localhost:5000/api,
  pathForType() {
    return "cars";
  }
});

适配器“车辆”:

import RESTAdapter from '@ember-data/adapter/rest';
export default RESTAdapter.extend({
  host: http://localhost:5000/api,
  pathForType() {
    return "vehicles";
  }
});

序列化器“汽车”:

import RESTSerializer from '@ember-data/serializer/rest';
export default RESTSerializer.extend({
  normalizeResponse(store, primaryModelClass, payload, id, requestType) {
    payload = {
      cars: payload
    };
    return this._super(store, primaryModelClass, payload, id, requestType);
  },
  primaryKey: '_id'
});

序列化器“车辆”:

import RESTSerializer from '@ember-data/serializer/rest';
export default RESTSerializer.extend({
  normalizeResponse(store, primaryModelClass, payload, id, requestType) {
    payload = {
      vehicles: payload
    };
    return this._super(store, primaryModelClass, payload, id, requestType);
  },
  primaryKey: '_id'
});

车型:

import DS from 'ember-data';
const { attr } = DS;
export default DS.Model.extend({
  name: attr("string"),
  body: attr("array"),
  date: attr('date')
});

车型(同车!):

import DS from 'ember-data';
const { attr } = DS;
export default DS.Model.extend({
  name: attr("string"),
  body: attr("array"),
  date: attr('date')
});

汽车索引路线:

import Route from '@ember/routing/route';
export default class CarsIndexRoute extends Route {
  model() {
    return this.store.findAll("car");
  }
}

车辆索引路线:

import Route from '@ember/routing/route';
export default class VehiclesIndexRoute extends Route {
  model() {
    return this.store.findAll("vehicle");
  }
}

Hbs 模板完全相似。 cars/index.hbs(和 vehicles/index.hbs):

{{#each @model as |item|}}
<h3>{{item.name}}</h3>
<p>{{item.body}}</p>
{{/each}}

代码清楚地表明结构是相同的,区别仅在于一个参数,对应模型名称和api端点的“结束”。 有人可以告诉我如何按照 Ember 的传统更正确地组织所有内容吗? 谢谢!

Ember 的优点在于它基于约定。在你的情况下,这意味着一旦 /cars/vehicles 位于相同的端点(他们这样做)并且具有相同的结构(他们似乎也这样做)你只需要一个适配器和序列化程序全部。

import RESTAdapter from '@ember-data/adapter/rest';

export default class ApplicationAdapter extends RESTAdapter {
  host = "http://localhost:5000";
  namespace = 'api'
} 
import RESTSerializer from '@ember-data/serializer/rest';

export default class ApplicationSerializer extends RESTSerializer {
  primaryKey = '_id';

  // not sure exactly what happens in the payload but I am pretty sure you'd be able to generalize it correspondingly
}

至于模型和路线,我会保留它们原样或在需要时提取超类。