文档章节

Ember.js 入门指南——定义模型

ubuntuvim
 ubuntuvim
发布于 2015/10/18 16:38
字数 1527
阅读 480
收藏 0

model也是一个类,它定义了向用户展示的属性和数据行为。model的定义非常简单,只需要继承DS.Model类即可,或者你也可以直接使用Ember CLI命令创建。比如使用命令ember g model person定义了一个modelperson

//  app/models/person.js
 
import DS from 'ember-data';
 
export default DS.Model.extend({
 
});

这个是个空的model,没有定义任何属性。有了model类你就可以使用find方法查找数据了。

 

1,定义属性

       上面定义的modelperson还没有任何属性,下面为这个类添加几个属性。

//  app/models/person.js
 
import DS from 'ember-data';
 
export default DS.Model.extend({
       firstName: DS.attr(),
       lastName: DS.attr(),
       birthday: DS.attr() 
});

上述代码定义了3个属性,但是还未给属性指定类型,默认都是string类型。这些属性名与你连接的服务器上的数据key是一致的。甚至你还可以在model中定义计算属性

//  app/models/person.js
 
import DS from 'ember-data';
 
export default DS.Model.extend({
       firstName: DS.attr(),
       lastName: DS.attr(),
       birthday: DS.attr(),
 
       fullName: Ember.computed('firstName', 'lastName', function() {
              return `${this.get('firstName')} ${this.get('lastName')}`;
       })
});

       这段代码在model类中定义了一个计算属性fullName

2,指定属性类型与默认值

       前面定义的model类是没有指定属性类型的,默认情况下都是string类型,显然这是不够的,简单的model属性类型包括:stringnumberbooleandate。这几个类型我想不用我解释都应该知道了。

       不仅可以指定属性类型,你还可以指定属性的默认值,在attr()方法的第二个参数指定。比如下面的代码:

//  app/models/person.js
 
import DS from 'ember-data';
 
export default DS.Model.extend({
       username: DS.attr('string'),
       email: DS.attr('string'),
       verified: DS.attr('boolean', { defaultValue: false }),  //指定默认值是false
       //  使用函数返回值作为默认值
       createAt: DS.attr('string', { defaultValue(){ return new Date(); } })
});

       正如代码注释所述的,设置默认值的方式包括直接指定或者是使用函数返回值指定。

 

3,定义model的关联关系

       Embermodel也是有类似于数据库的关联关系的。只是相对于复制的数据库Embermodel就显得简单很多,其中包括一对一,一对多,多对多关联关系。这种关系是与后台的数据库是相统一的。

1,一对一

       声明一对一关联使用DS.belongsTo设置。比如下面的两个model

//  app/models/user.js
import DS from 'ember-data';
 
export default DS.Model.extend({
  profile: DS.belongsTo(‘profile’);
});
//  app/models/profile.js
import DS from ‘ember-data’;
export default DS.Model.extend({
  user: DS.belongsTo(‘user’);
});

 

2,一对多

       声明一对多关联使用DS.belongsTo(多的一方使用)和DS.hasMany(少的一方使用)设置。比如下面的两个model

//  app/models/post.js
import DS from ‘ember-data’;
export default DS.Model.extend({
  comments: DS.hasMany(‘comment’);
});

       这个model是一的一方。下面的model是多的一方;

//  app/models/comment.js
import DS from ‘ember-data’;
export default DS.Model.extend({
  post: DS.belongsTo(‘post’);
});

       这种设置的方式与Java hibernate非常相似。

3,多对多

声明一对多关联使用DS.hasMany设置。比如下面的两个model

//  app/models/post.js
import DS from ‘ember-data’;
export default DS.Model.extend({
  tags: DS.hasMany(‘tag’);
});
//  app/model/tag.js
import DS from ‘ember-data’;
export default DS.Model.extend({
  post: DS.hasMany(‘post’);
});

       多对多的关系设置都是使用hasMany,但是并不需要中间表,这个与数据的多对多有点不同,如果是数据的多对多通常是通过中间表关联。

 

4,显示反转

       Ember Data会尽力去发现两个model之间的关联关系,比如前面的一对多关系中,当comment发生变化的时候会自动更新到post,因为每一个comment只对应一个post,可以有comment确定到某个一个post

       然而,有时候同一个model中会有多个与此关联model。这时你可以在反向端用DS.hasManyinverse选项指定其关联的model

//  app/model/comment.js
import DS from ‘ember-data’;
export default DS.Model.extend({
  onePost: DS.belongsTo(‘post’),
  twoPost: DS.belongsTo(‘post’),
  redPost: DS.belongsTo(‘post’),
  bluePost: DS.belongsTo(‘post’)
});

       在一个model中同时与3post关联了。

//  app/models/post.js
import DS from ‘ember-data’;
export default DS.Model.extend({
  comments: hasMany(‘comment’, { inverse: ‘redPost’ });
});

       comment发生变化时自动更新到redPost这个model

 

5,自反关系

1,一对多

当你想定义一个自反关系的model时(模型本身的一对一关系),你必须要显式使用inverse指定关联的model。如果没有逆向关系则把inverse值设置为null

//  app/models/folder.js
import DS from ‘ember-data’;
export default DS.Model.extend({
  children: DS.hasMany(‘folder’, { reverse: ‘parent’ });
  parent: DS.hasMany(‘folder’, { reverse: ‘children’ });
});

       一个文件夹通常有父文件夹或者子文件夹。此时父文件夹和子文件夹与本身都是同一个类型的模型。此时你需要显式使用inverse属性指定,比如这段代码所示,“children……”这行代码意思是这个模型有一个属性children,并且这个属性也是一个folder,模型本身作为父文件夹。同理“parent……”这行代码的意思是这个模型有个属性parent,并且这个属性也是一个folder,模型本身是这个属性的子文件夹。比如下图结构:

这个有点像数据结构中的链表。你可以把childrenparent想象成是一个指针。

       如果仅有关联关系没有逆向关系直接把inverse设置为null

//  app/models/folder.js
import DS from ‘ember-data’;
export default DS.Model.extend({
  parent: DS.belongsTo(‘folder’, { inverse: null });
});
2,一对一
//  app/models/user.js
import DS from ‘ember-data’;
export default DS.Model.extend({
  bestFriend: DS.belongsTo(‘folder’, { inverse: ‘bestFriend’ });
});

       这个关系与数据库设置设计中双向一对一很类似。

 

6,嵌套数据

       有些model可能会包含深层嵌套的数据对象,如果也是使用上述的关联关系定义那么将是个噩梦!对于这种情况最好是把数据定义成简单对象,虽然增加点冗余数据但是降低了层次。另外一种是把嵌套的数据定义成model的属性(也是增加冗余但是降低了嵌套层次)。


© 著作权归作者所有

ubuntuvim
粉丝 33
博文 76
码字总数 98477
作品 1
深圳
后端工程师
私信 提问
Ember.js 入门指南——总目录

Ember.js 是什么?我想对于想学习它的人应该知道它是个什么东西,如果你想了解那就赶紧去 Google 或者百度,本系列教程是通过学习官网教程然后摘抄个人觉得比较重要的部分,加上学习实例整合...

ubuntuvim
2015/10/25
1K
2
Ember.js 入门指南--目录

本系列文章全部从(http://ibeginner.sinaapp.com/)迁移过来,欢迎访问原网站。 Ember.js 是什么?我想对于想学习它的人应该知道它是个什么东西,如果你想了解那就赶紧去 Google 或者百度,...

ubuntuvim
2015/09/07
384
2
Ember.js 入门指南——指定与路由关联的模型

路由其中一个很重要的职责就是加载适合的model,初始化数据,然后在模板上显示数据。 1,普通model关联 // app/router.js // …… Router.map(function() { this.route('posts');}); export...

ubuntuvim
2015/09/25
430
0
Ember.js 入门指南——模板渲染

路由的另一个重要职责是渲染同名字的模板。 比如下面的路由设置,posts路由渲染模板posts.hbs,路由new渲染模板posts/new.hbs。 Router.map(function() { this.route('posts', function() {...

ubuntuvim
2015/09/25
442
0
从服务器获取数据,引入组件

博文原址:http://blog.ddlisting.com/2016/04/21/yin-ru-zu-jian/ 接着前面四篇: 环境搭建以及使用Ember.js创建第一个静态页面 引入计算属性、action、动态内容 模型,保存数据到数据库 发...

ubuntuvim
2016/04/26
71
0

没有更多内容

加载失败,请刷新页面

加载更多

centos7命令行和图形界面的相互切换

最近安装了centos7,发现在命令行和图形界面的相互切换命令上,与centos以往版本有很大不同。 1,centos7默认安装后,跟其他版本一样,启动默认进入图形界面; 2,在图形化桌面,右击鼠标,选...

无名氏的程序员
27分钟前
6
0
对称的二叉树

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。 boolean isSymmetrical(TreeNode pRoot) { if (pRoot == null) ...

Garphy
36分钟前
3
0
快速失败 (fail-fast) 和安全失败 (fail-safe) 的区别是什么

一:快速失败(fail—fast) 在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。 原理:迭代器在...

Bb进阶
38分钟前
7
0
golang 数据库与JSON解析一起 用空格分割

type Stocks struct { Id string `xorm:"varchar(64) pk" json:"id"` Name string `xorm:"varchar(64)" json:"name"` StockNum str......

zdglf
42分钟前
6
0
恨天诀——第一集 第五章

天似穹庐,笼盖四野。 静静矗立的天柱峰,像一把长剑,直插云霄。山南显得格外阴冷,萧瑟。 “龙儿,何为天道?”一长一少两人默默并排而立,长者问道。 良久,少年回答:“父亲,恕孩儿驽钝...

Kerwin_zZ
48分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部