一、概述

1. 模型是一个类,它定义了你呈现给用户的数据的属性和行为。用户希望如果他们离开你的应用程序,并返回后(或如果他们刷新页面)看到的任何东西应该被一个model代表。

2. 确保在ember.js后引入ember-data.js:

<script type="text/javascript" src="ember.js"></script>
<script type="text/javascript" src="ember-data.js"></script>

3. 对应用程序中的每个模型来说,创建一个DS.Model的子类:

app/models/person.js

export default DS.Model.extend();

4. 在你定义了一个model类之后,你可以开始为这个类型查找和创建records。当与store交互时,你需要使用model name来指定一个record的type。例如,store的find()方法期望有一个字符串作为它的第一个参数,告诉它查找什么类型的record:

store.findRecord('person', 1);

5. 下面的表格展示了模型的名字如何映射模型文件的路径:

Model Name Model Class
photo app/models/photo.js
admin-user-profile app/models/admin-user-profile.js

二、Defining attributes

1. 你可以通过使用DS.attr来指定一个model有哪些属性。app/models/person.js

export default DS.Model.extend({
firstName: DS.attr(),
lastName: DS.attr(),
birthday: DS.attr()
});

2. 当从服务器返回的JSON转换为一个实例,当实例改变后序列化一个实例保存到服务器时,属性被使用。

3. 你也可以使用属性像其他属性一样,包括作为计算属性的一部分。往往,你会希望定义一个计算属性,它结合或者转换原始属性。

app/models/person.js

export default DS.Model.extend({
firstName: DS.attr(),
lastName: DS.attr(), fullName: Ember.computed('firstName', 'lastName', function() {
return this.get('firstName') + ' ' + this.get('lastName');
})
});

4. 如果你不指定属性的类型,它将会是服务器提供的任何类型。通常你可以通过type或者attr确定把一个属性强制指定为特定的类型:

app/models/person.js

export default DS.Model.extend({
birthday: DS.attr('date')
});

5. 默认的adapter提供string, number, boolean和date属性类型。自定义的adapters可能提供其他的属性类型,并且新类型可以被注册为变换式。请查看documentation section on the REST Adapter

6. 请注意Ember Data根据ISO 8601序列化和反序列化日期。例如:2014-05-27T12:54:01

8. Options

DS.attr用一个可选择的hash作为第二个参数:

(1) defaultValue: 如果没有提供的话,传递一个字符串或者一个被调用的function来设置为属性的默认值。

(2) example:

app/models/user.js

export default DS.Model.extend({
username: DS.attr('string'),
email: DS.attr('string'),
verified: DS.attr('boolean', {defaultValue: false}),
createdAt: DS.attr('string', {
defaultValue() { return new Date(); }
})
});

三、Defining Relationships

Ember Data包含几个内置的关系类型,帮助我们定义你的模型是如何相互联系的。

1. one-to-one

使用DS.belongsTo在两个模型间声明一对一关系:

app/models/user.js

export default DS.Model.extend({
profile: DS.belongsTo('profile')
});

app/models/profile.js

export default DS.Model.extend({
user: DS.belongsTo('user')
});

2. one-to-many

使用DS.belongsToDS.hasMany结合来声明两个模型之间的一对多关系:

app/models/post.js

export default DS.Model.extend({
comments: DS.hasMany('comment')
});

app/models/comment.js

export default DS.Model.extend({
post: DS.belongsTo('post')
});

3. many-to-many

使用DS.hasMany来声明两个模型之间的多对多关系:

app/models/post.js

export default DS.Model.extend({
tags: DS.hasMany('tag')
});

app/models/tag.js

export default DS.Model.extend({
posts: DS.hasMany('post')
});

4. explicit inverses(显式倒转)

(1) Ember Data将尽其所能发现映射到另一个的关系。在上面的one-to-many代码中,例如,Ember Data可以找出,改变comments的关系应该相反的更新post关系,因为post是唯一到该model的关系。

(2) 然而,有些时候对同一个类型你可能有许多个belongsTo/hasMany。你可以使用DS.hasManyinverse选项指定在相关的模型中哪一个是倒转的:

app/models/comment.js

export default DS.Model.extend({
onePost: DS.belongsTo('post'),
twoPost: DS.belongsTo('post'),
redPost: DS.belongsTo('post'),
bluePost: DS.belongsTo('post')
});

app/models/post.js

export default DS.Model.extend({
comments: DS.hasMany('comment', {
inverse: 'redPost'
})
});

你也可以在一个belgongsTo上指定一个倒转,它可以像你期望的那样工作。

5. reflexive relation(自关联关系)

当你想定义一个自关联关系,你必须明确定义另一方,并且设置相应的显示倒转,如果你不需要另一方,设置为null。

app/models/folder.js

export default DS.Model.extend({
children: DS.hasMany('folder', { inverse: 'parent' }),
parent: DS.belongsTo('folder', { inverse: 'children' })
});

app/models/folder.js

export default DS.Model.extend({
parent: DS.belongsTo('folder', { inverse: null })
});

7.2 Models -- Defining Models的更多相关文章

  1. [C5W3] Sequence Models - Sequence models & Attention mechanism

    第三周 序列模型和注意力机制(Sequence models & Attention mechanism) 基础模型(Basic Models) 在这一周,你将会学习 seq2seq(sequ ...

  2. Popular generalized linear models|GLMM| Zero-truncated Models|Zero-Inflated Models|matched case–control studies|多重logistics回归|ordered logistics regression

    ============================================================== Popular generalized linear models 将不同 ...

  3. [MST] Describe Your Application Domain Using mobx-state-tree(MST) Models

    In this lesson, we introduce the running example of this course, a wishlist app. We will take a look ...

  4. Django基础,Day2 - 编写urls,views,models

    编写views views:作为MVC中的C,接收用户的输入,调用数据库Model层和业务逻辑Model层,处理后将处理结果渲染到V层中去. polls/views.py: from django.h ...

  5. Fitting Bayesian Linear Mixed Models for continuous and binary data using Stan: A quick tutorial

    I want to give a quick tutorial on fitting Linear Mixed Models (hierarchical models) with a full var ...

  6. Django学习(三)---Models(ORM框架)

    1) Django 中Models是与数据库相关的,与数据库相关的代码一般写在 models.py中,Django 支持 sqlite3, MySQL, PostgreSQL等数据库,只需要在sett ...

  7. Django的Models(三)

    ORM操作的一些进阶的方法: ################################################################## # PUBLIC METHODS T ...

  8. Django—models相关操作

    一.在django后台admin管理页面添加自己增加的表结构 通过终端命令:python3 manage.py makemigrations, python3 manage.py migrate 我们 ...

  9. Django之Models操作

    一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 pr ...

随机推荐

  1. android学习之--网格视图(GridView)和图像切换器(ImageSwitcher)

             GridView用于在界面上按行.列分布显示多个组件.GridView和ListView有共同父类:AbsListView. GridView与ListView的差别在于:ListV ...

  2. ionic简单路由及页面传参

    1)页面跳转及传参方法 angular.module('app.routes', [])//routes路由模型 .config(function($stateProvider, $urlRouter ...

  3. 第七篇:Logistic回归分类算法原理分析与代码实现

    前言 本文将介绍机器学习分类算法中的Logistic回归分类算法并给出伪代码,Python代码实现. (说明:从本文开始,将接触到最优化算法相关的学习.旨在将这些最优化的算法用于训练出一个非线性的函数 ...

  4. C#中的方法,方法的重载,以及几个关键字

    嘿嘿,今天来的早点啦,主要有问题解决不了,希望看到的亲们知道怎么整的给我说下,先谢谢哦:-D <一>首先复习了三元表达式:即  表达式1,表达式2,表达式3: 举例: bool resul ...

  5. Android 使用线性布局LinearLayout和Button实现一个点红块游戏

    这个游戏的功能类似打地鼠. 项目地址:https://github.com/moonlightpoet/RedBlock 程序下载试玩地址:https://github.com/moonlightpo ...

  6. echarts实现柱状图分页展示

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. Linux命令之type - 显示命令的类型

    用途说明 type命令用来显示指定命令的类型.一个命令的类型可以是如下之一 alias 别名 keyword 关键字,Shell保留字 function 函数,Shell函数 builtin 内建命令 ...

  8. 网络虚拟化技术(一): Linux网络虚拟化

    创建虚拟网络环境 使用命令 $ ip netns add net0 可以创建一个完全隔离的新网络环境,这个环境包括一个独立的网卡空间,路由表,ARP表,ip地址表,iptables,ebtables, ...

  9. MarkDownPad2 key

    MarkDownPad2 key : Soar360@live.com GBPduHjWfJU1mZqcPM3BikjYKF6xKhlKIys3i1MU2eJHqWGImDHzWdD6xhMNLGVp ...

  10. 批量远程执行linux服务器程序--基于pxpect(多进程、记日志版)

    #!/usr/bin/python '''Created on 2015-06-09@author: Administrator''' import pexpect import os,sys fro ...