zoukankan      html  css  js  c++  java
  • 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 })
    });
  • 相关阅读:
    LeetCode 123. Best Time to Buy and Sell Stock III (stock problem)
    精帖转载(关于stock problem)
    LeetCode 122. Best Time to Buy and Sell Stock II (stock problem)
    LeetCode 121. Best Time to Buy and Sell Stock (stock problem)
    LeetCode 120. Triangle
    基于docker 搭建Elasticsearch5.6.4 分布式集群
    从零开始构建一个centos+jdk7+tomcat7的docker镜像文件
    Harbor实现容器镜像仓库的管理和运维
    docker中制作自己的JDK+tomcat镜像
    docker镜像制作---jdk7+tomcat7基础镜像
  • 原文地址:https://www.cnblogs.com/sunshineground/p/5165945.html
Copyright © 2011-2022 走看看