• 7.2 Models -- Defining Models


    一、概述

    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 NameModel 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 })
    });
  • 相关阅读:
    斯坦福【概率与统计】课程笔记(〇):前言
    斯坦福【概率与统计】课程笔记(二):从EDA开始
    dot
    左移右移
    树莓派系统烧写+网络配置
    windows上面捕获声卡数据
    python1
    继续进销存系统
    base64编码
    DES原理
  • 原文地址:https://www.cnblogs.com/sunshineground/p/5165945.html
Copyright © 2020-2023  润新知