【问题标题】:emberjs JSON format handlingemberjs JSON 格式处理
【发布时间】:2014-02-20 09:03:38
【问题描述】:

我的 emberjs 应用程序中有一个 Employee 模型,我正在尝试使用以下格式的 RESTful Web 服务加载Employees 内容:

{
    "Result": [
        {
            "EmployeeId": "1",
            "EmployeeName": "Mark Smith",
            "Active": 0,
            "Dept": "Sales"
        },
        {
            "EmployeeId": "2",
            "EmployeeName": "John Smith",
            "Active": 1,
            "Dept": "Sales"
        },
        {
            "EmployeeId": "3",
            "EmployeeName": "Michael Smith",
            "Active": 1,
            "Dept": "Administration"
        }
    ],
    "ResultCount": 3
}

这里我面临 3 个问题:

  1. 是否可以读取此 JSON 格式并将其添加到 Employee 模型中,我知道“Result”应该是“Employees”,但我无法控制返回 JSON 格式,所以如果可以的话使用“结果”会很棒。任何这样做的例子都非常感谢。

  2. 如何处理“ResultCount”?有没有办法可以将它作为 Employee 模型的一部分来阅读?

  3. 如何在应用程序视图中将“Active”读取为“Active”/“Not Active”而不是 0 或 1?

感谢您的宝贵时间

【问题讨论】:

标签: json ember.js


【解决方案1】:

正如 jasonpgignac 所指出的,您需要编写一个自定义的序列化器/反序列化器来将数据放入 ember-data。

一旦您加载了数据,就不需要 ResultCount。您应该在返回的集合上使用“长度”属性。

作为序列化程序的一部分,您需要在模型中将 0/1 转换为 false/true。您可以添加如下属性:

activeLabel: ( ->
  if @get('active')
    'Active'
  else
    'Not Active'
).property('active')

并在您的模板中使用此属性。

根据要求,这是我项目中的示例类:

App.StudentSerializer = DS.ActiveModelSerializer.extend

  serializeBelongsTo: (record, json, relationship) ->
    key = relationship.key
    if key is 'attendance'
      @serializeAttendance(record, json)
    else
      json["#{key}_id"] = record.get("#{key}.id")

  serializeAttendance: (record, json) ->
    attendance = record.get('attendance')
    json['attendance'] = {}
    ['monday', 'tuesday', 'wednesday', 'thursday', 'friday'].forEach( (day) =>
      json['attendance'][day] = attendance.get(day)
    )

  serializeHasMany: (record, json, relationship) ->
    key = relationship.key

    jsonKey = Ember.String.singularize(key) + '_ids'
    json[jsonKey] = []
    record.get(key).forEach( (item) ->
      json[jsonKey].push(item.get('id'))
    )

我的 store.coffee 看起来像:

App.Store = DS.Store.extend
  # Override the default adapter with the `DS.ActiveModelAdapter` which
  # is built to work nicely with the ActiveModel::Serializers gem.
  adapter: '_ams'

App.ApplicationSerializer = DS.ActiveModelSerializer.extend()

如果您对后端没有任何控制权,您可能希望使用 JsonAdapter 并对其进行扩展。正如我在下面所说的,我还没有完成反序列化,但应该有必要的钩子让你转换成 ember-data 所需的格式。

【讨论】:

  • @Matrin 非常感谢您的回复。你知道我在哪里可以找到序列化器/反序列化器的样本吗?根据我对 Emberjs 的谦虚体验,真的很难找到解释其某些功能如何工作的示例/教程!
  • 您应该从emberjs.com/api/data/classes/… 和相关方法开始。使用那里的示例应该会给您一些想法,了解您需要更改哪些内容以使您的 JSON 符合 ember-data 所需的内容。另外,您使用的是什么版本的 ember-data?您希望使用最新的 1.0.0 候选版本,以便这些文档完全适用。
  • 我花了数天时间研究 Ember 课程、开源项目和网络教程。具有讽刺意味的是,所有这些努力都没有产生一个关于如何序列化/反序列化或如何为需要随每个 API 请求发送身份验证令牌的特定模型创建自定义 RESTAdapter 的工作示例……我什至在这里发布了问题有赏金但还没有回复...这只是我对 Ember 的挫败感的一个小提示 :) 我正在使用 Ember 1.3 并且仅记录 90% 的网络教程都在 1.0 版上...看起来就像许多人已经放弃支持 ember 一样!
  • 我正在使用 ember-simple-auth 进行令牌身份验证,它运行良好,您可以对其进行自定义以满足您的需求。您需要将身份验证与序列化分开。我将在我上面的一个项目中发布一个示例类。我只需要进行序列化,因为我在 Rails 后端使用 active_model_serializers,它反序列化很好。
  • 非常感谢,我会听从您的建议并查看 ember-simple-auth,我还将处理上面的示例。话虽如此,既然你熟悉 Ember,你介意回答这个问题吗stackoverflow.com/questions/21947548/…我已经提供了 +50 的奖励来回答这个问题。提前致谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多