1

在开发的过程中,EmberData 运行我们在本地创建 fixtures 来模拟 API backend 返回的数据,这样一来我们可以在没有 API service 的前提下直接搞前端的部分。好处嘛:

  1. 省时,所有的模拟请求都是 mock 掉的,即时响应。
  2. 省事,你可以在 API service 还没写好的情况下先行设计应用界面,并且在这一过程中你可以不断调整需要返回的数据模型样本,这样也为 API 的编写做了前置工作。

然而我遇到一个问题,在不用 FixtureAdapter 的时候,比如用 RESTAdapter,EmberData 会帮我做 serializing(序列化)的工作,但是 FixtureAdapter 则不会。这是什么意思呢?

所谓序列化,是指服务器返回的数据(比如 JSON),其字段和你在客户端(Javascript)使用的有差异。例如,假设有这样的数据经 API 返回:

{
    "created_at": "...",
    "updated_at": "..."
}

你在客户端定义的对应属性如果是这样的:

App.Something = DS.Model.extend({
    createdAt: DS.attr('date'),
    updatedAt: DS.attr('date')
});

那么 EmberData 会为你自动做这个匹配转化工作。因为 FixtureAdapter 不做这一步,所以我的 fixtures 不得不写成这样:

{
    "createdAt": "...",
    "updatedAt": "..."
}

坦白说,虽然这样并不妨碍什么,但是我看着很不爽……另外,假设你所处的团队恰好是写 API 的人要参照你的 fixtures,那么你若不告诉他这件事情,他就真写成这样了……

Anyway,肯定有办法改过来不是,办法就是:

DS.FixtureAdapter.reopen({
    serializer: function () {
        return;
    }.property();
});

就这样?是的,就这样。实际上所有的 adapters 都有默认的 serializer(应该是 DS.JSONSerializer),只不过在 FixtureAdapter 里重写成了:

serializer: null

Why is that? Yehuda said:

The goal of fixtures is to use data using the model representation, using the same keys and relationship names that you use in the model. We don't want people to have broken fixtures just because they happen to start using the RESTAdapter for some other models.

大致的意思是:使用 fixtures 的目的就是为了让数据和 Model 的保持一致,大家用一样的键名和关系名,这样一旦你对别的 Models 使用了其他的 adapters,比如 RESTAdapter,fixtures 也不会因此而无法使用。

哼……你把 fixtures 写的和服务器返回的一样不就好啦?!(个人喜好)


n͛i͛g͛h͛t͛i͛r͛e͛
31.1k 声望3.1k 粉丝

正在更新 Elixir 语言的系列文章:[链接]


引用和评论

0 条评论