Ember Data 之模型定义

简介: 前面在《 Ember.js 项目开发之 Ember Data 》介绍了Ember Data,本文将继续介绍模型的定义。

前面在《 Ember.js 项目开发之 Ember Data 》介绍了Ember Data,本文将继续介绍模型的定义。

模型是定义呈现给用户的数据的属性和行为的类。如果用户离开应用后再回来(或者刷新页面),他们希望看到的任何东西都应该由模型来表示。

当为应用程序创建一个新模型时,需要在 models 文件夹下创建一个新文件并从 Model 扩展。使用 Ember CLI 的生成器命令可以方便地完成这一操作。例如,下面创建一个 person 模型:

ember generate model person

这将生成以下文件:app/models/person.js

import Model from '@ember-data/model';
export default class PersonModel extends Model {
}

定义模型类后,就可以开始查找并使用该类型的记录。

Ember Data 模型通常以单数形式设置(这就是为什么在本文使用person而不是people的原因)

定义属性

生成 person 模型后没有任何属性,下面开始增加一些属性:

import Model, { attr } from '@ember-data/model';
export default class PersonModel extends Model {
  @attr firstName;
  @attr lastName;
  @attr birthday;
}

当将从服务器返回的JSON有效负载转换为记录时,以及在修改记录后序列化记录以保存回服务器时,将使用属性。

可以像使用其他任何属性一样使用属性,包括从getter函数中使用。

import Model, { attr } from '@ember-data/model';
export default class PersonModel extends Model {
  @attr firstName;
  @attr lastName;
  get fullName() {
    return `${this.firstName} ${this.lastName}`;
  }
}

Transforms

可能会发现服务器返回的属性类型与要在JavaScript代码中使用的类型不匹配。Ember Data 允许为称为转换的属性类型定义简单的序列化和反序列化方法。可以通过提供转换名称作为方法的第一个参数,来指定要为属性运行转换 attr。Ember Data 支持的属性类型string,number,boolean,和date,这些类型将值强制转换为与其名称匹配的JavaScript类型。

import Model, { attr } from '@ember-data/model';
export default class PersonModel extends Model {
  @attr('string') name;
  @attr('number') age;
  @attr('boolean') admin;
  @attr('date') birthday;
}

日期转换将 ISO 8601 字符串转换为JavaScript日期对象。

布尔值转换可以处理 true 或 false 以外的值。字符串"true"或"t"任何大写字母,和"1"数字 1 都将强制转换为 true,反之为 false。

转换不是必需的,如果没有指定转换名称,Ember Data 将不会对该值进行额外的处理。

自定义Transforms

可以使用 Ember CLI 的 transform 生成器创建自定义转换:

ember generate transform dollars

这是一个简单的转换,可在美分和美元之间转换价值。

import Transform from '@ember-data/serializer/transform';
export default class DollarsTransform extends Transform {
  deserialize(serialized) {
    return serialized / 100; // returns dollars
  }
  serialize(deserialized) {
    return deserialized * 100; // returns cents
  }
}

转换有两个功能:序列化 serialize 和反序列化 deserialize。反序列化将值转换为客户端期望的格式。序列化则相反,将值转换为持久层所期望的格式。

以下使用自定义 dollars 转换:

import Model, { attr } from '@ember-data/model';
export default class ProductModel extends Model {
  @attr('dollars') spent;
}

选项Options

attr 也可以将选项的哈希作为第二个参数。目前唯一可用的选项是 defaultValue,它可以使用一个值或一个函数来设置属性的默认值(如果没有提供的话)。

在下面的例子中,定义了 verified 的默认值为 false ,而 createdAt 的默认值为模型创建时的当前日期:

import Model, { attr } from '@ember-data/model';
export default class UserModel extends Model {
  @attr('string') username;
  @attr('string') email;
  @attr('boolean', { defaultValue: false }) verified;
  @attr('date', {
    defaultValue() { return new Date(); }
  }) createdAt;
}

Read-only属性

当API返回一个深度嵌套的只读对象或数组时,不需要创建多个具有 attr('hasMany') 或 attr('belongsTo') 关系的模型。这可能会导致大量不必要的代码,可以访问模板中的这些对象,而不需要对它们进行转换。这可以通过使用 @attr 来完成,而无需指定转换:

import Model, { attr } from '@ember-data/model';
export default class PlaceModel extends Model {
  @attr location; // a read-only object
  @attr tags; // a read-only array
}
{{@model.location.latitude}}


相关文章
|
监控 供应链 API
1688商品列表API全参数指南:从基础搜索到高级筛选
1688商品列表API是阿里巴巴B2B平台的核心接口,支持关键词搜索、高级筛选、排序与分页功能,适用于选品、价格监控等场景。数据规范、稳定高效,日均调用量大。提供Python示例代码,便于快速接入与扩展应用。
|
9月前
|
Ubuntu 安全 Linux
蓝易云:Ubuntu Server上安装配置Docker的详细步骤
通过以上步骤,您将成功在Ubuntu Server上安装和配置Docker。这些步骤提供了将Docker集成到您的Ubuntu系统中的简洁而全面的方法,并为使用Docker作为开发和部署的强大工具奠定了基础。通过执行上述步骤,用户能够从安装到配置Docker,进一步扩展其服务器的功能性。随着Docker的普及和生态系统的快速发展,理解并掌握这些基础步骤对于有效管理容器化应用至关重要。
391 8
|
11月前
|
人工智能 监控 数据可视化
大厂都在用的测试基础设施:深度解析Dify工作流引擎的设计哲学与最佳实践
Dify作为开源大模型应用开发平台,凭借其低代码可视化工作流引擎,正成为大厂智能测试基础设施核心。一体化架构与企业级安全设计,实现测试流程高效、可靠自动化。支持接口、性能、视觉等多场景测试,助力AI能力深度融入研发流程,显著提升交付质量与速度。
|
存储 弹性计算 关系型数据库
【赵渝强老师】达梦数据库的产品系列
达梦数据库是达梦公司推出的新一代自研数据库,融合分布式、弹性计算与云计算优势,支持超大规模并发事务处理和HTAP混合业务。产品体系包括DM8、DMDSC、DM DataWatch、DMMPP和DMRWC,分别适用于通用关系型数据库、共享存储集群、数据守护集群、大规模数据分析及读写分离场景,满足不同需求并保障高可用性和安全性。
936 36
|
Java 应用服务中间件 Docker
java-web部署模式概述
本文总结了现代 Web 开发中 Spring Boot HTTP 接口服务的常见部署模式,包括 Servlet 与 Reactive 模型、内置与外置容器、物理机 / 容器 / 云环境部署及单体与微服务架构,帮助开发者根据实际场景选择合适的方案。
807 25
|
机器学习/深度学习 人工智能 并行计算
【AI系统】GPU 架构回顾(从2010年-2017年)
自1999年英伟达发明GPU以来,其技术不断革新。本文概述了从2010年至2024年间,英伟达GPU的九代架构演变,包括费米、开普勒、麦克斯韦、帕斯卡、伏特、图灵、安培、赫柏和布莱克韦尔。这些架构不仅在游戏性能上取得显著提升,还在AI、HPC、自动驾驶等领域发挥了重要作用。CUDA平台的持续发展,以及Tensor Core、NVLink等技术的迭代,巩固了英伟达在计算领域的领导地位。
1510 1
|
人工智能 架构师 Java
最高裁95%,只留5% 用AI的,某上市公司全面ai化。你的岗位,AI入侵指数是 多少?多久消失?
本文探讨了AI对不同岗位的冲击及未来趋势,特别提到上美股份大规模裁员以保留能使用AI的员工。文中分析了Java开发、大数据开发、架构师、产品经理等岗位的AI入侵指数,指出高风险和低风险岗位,并建议进入AI入侵指数低的领域如Java+AI+大数据架构师。此外,文章还介绍了尼恩团队的大模型学习资源和面试指导服务,帮助从业者提升技能,应对AI时代的挑战。
|
网络协议 Linux iOS开发
|
算法 C语言
C数据结构-翻转指针法、头插法实现单链表反转
本文介绍以C语言实现无头单链表反转的算法:翻转指针法与头插法。
629 4
|
人工智能
本地离线部署大模型知识库OLLAMA+Anything(保姆级)
本地离线部署大模型知识库OLLAMA+Anything(保姆级)
11911 3

热门文章

最新文章