EmberJS - 关系

Ember.js 提供关系类型来指定模型如何相互关联。有不同的关系类型,例如,一对一关系可以与 DS.belongsTo 一起使用,一对多关系可以与 DS.hasMany 以及 DS.belongsTo 一起使用,多对多关系可以与 DS.hasMany 一起使用。

语法

import DS from 'ember-data';

export default DS.Model.extend ({
    var_name1: DS.belongsTo('model_name1'),
    var_name2: DS.hasMany('model_name2')
});

示例

下面给出的示例展示了关系类型的使用。使用以下命令创建两个名为 account 和 staff 的适配器 −

ember generate adapter adapter_name

现在打开 app/adapters/account.js 文件并添加以下代码 −

import ApplicationAdapter from './application';

//创建一个"帐户"数组来存储关系数据
const account = {
   "data": {
      "type": "account",
      "id": "100",

      "relationships": {
         "secondVal": {
            "data": {
               "type": "staff",
               "id": "2"
            }
         },
         "firstVal": {
            "data": {
               "type": "staff",
               "id": "1"
            }
         }
      }
   }
};

export default ApplicationAdapter.extend ({
   //此方法从"staff"适配器获取数据
   findRecord() {
      //从数组返回数据
      return account;
   }
});

打开 app/adapters/staff.js 文件并添加以下代码 −

import ApplicationAdapter from './application';
import Ember from 'ember';

//为 type 和 id 指定值
const relval1 = {
   data: {
      type: "staff",
      id: "1",
      attributes: {
         name: 'JavaScript'
      }
   }
};

const relval2 = {
   data: {
      type: "staff",
      id: "2",
      attributes: {
         name: 'jQuery'
      }
   }
};

//变量"relval3"将数据推送到"relval1"和"relval2"
const relval3 = Ember.A();
relval3.pushObject(relval1);
relval3.pushObject(relval2);

export default ApplicationAdapter.extend ({
   findRecord(store, type, id) {
      //查找项目 ID 并返回"relval3"变量
      let valret = relval3.find(function (item) {
         return id === Ember.get(item, 'data.id');
      });
      //搜索到的项目将从"valret"变量传递给"relval3"
      return valret;
   }
});

创建两个模型,名称分别为 account 和 staff。打开 app/models/account.js 文件并包含以下代码 −

import DS from 'ember-data';
import Model from "ember-data/model";
import attr from "ember-data/attr";

//定义模型之间的一对一和一对多关系
import { belongTo, hasMany } from "ember-data/relationships";

export default DS.Model.extend({
    //当 async 为 'true' 时,它将获取相关条目
   	firstVal: belongsTo('staff', {async: true}),
   	secondVal: belongsTo('staff', {async: true})
});

现在打开 app/models/staff.js 文件并包含以下代码 −

import DS from 'ember-data';
import Model from "ember-data/model";
import attr from "ember-data/attr";
import { belongsTo, hasMany } from "ember-data/relationships";

export default DS.Model.extend ({
   //使用'attr()'方法指定属性
   name: attr()
});

接下来,创建一个路由并将其命名为 application.js。打开此文件(在 app/routes/ 下创建),并添加以下代码 −

import Ember from 'ember';

export default Ember.Route.extend ({
    model(){
        //返回 model() 钩子的值
        return this.get('store').findRecord('account', 100); //检索特定 id 的记录
    }
});

使用以下命令创建名为 application 的序列化器 −

ember generate serializer serializer_name

打开 app/serializers/application.js 文件并添加以下代码 −

import DS from 'ember-data';

//它是默认的序列化器,可与 JSON API 后端配合使用
export default DS.JSONAPISerializer.extend ({
   
    //keyForRelationship() 方法覆盖命名约定
    keyForRelationship: function(key, relationship, method) {
        return Ember.String.camelize(key); //返回字符串的 lowerCamelCase 形式
    }
});

使用以下代码打开在 app/templates/ 下创建的 application.hbs 文件 −

<h2>Model Relationships</h2>
//display the id along with the name
{{model.firstVal.id}} : {{model.firstVal.name}}
<br>
{{model.secondVal.id}} : {{model.secondVal.name}}
{{outlet}}

输出

运行 ember 服务器;您将收到以下输出 −

Ember.js 模型关系

emberjs_model.html