- EmberJS 教程
- EmberJS - 主頁
- EmberJS - 概覽
- EmberJS - 安裝
- EmberJS - 核心概念
- 建立和執行應用程式
- EmberJS - 物件模型
- EmberJS - 路由器
- EmberJS - 模板
- EmberJS - 元件
- EmberJS - 模型
- EmberJS - 管理依賴項
- EmberJS - 應用程式顧慮
- EmberJS - 配置 Ember.js
- EmberJS - Ember 檢查器
- EmberJS 有用資源
- EmberJS - 快速指南
- EmberJS - 有用資源
- EmberJS - 討論
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')
});
示例
以下所示示例展示了關係型別如何使用。使用以下命令建立兩個名為賬戶和員工的介面卡 −
ember generate adapter adapter_name
現在開啟 app/adapters/account.js 檔案並新增以下程式碼 −
import ApplicationAdapter from './application';
//created an "account" array to store relationship data
const account = {
"data": {
"type": "account",
"id": "100",
"relationships": {
"secondVal": {
"data": {
"type": "staff",
"id": "2"
}
},
"firstVal": {
"data": {
"type": "staff",
"id": "1"
}
}
}
}
};
export default ApplicationAdapter.extend ({
//this method fetches data from 'staff' adapter
findRecord() {
//returns the data from array
return account;
}
});
開啟 app/adapters/staff.js 檔案並新增以下程式碼 −
import ApplicationAdapter from './application';
import Ember from 'ember';
//values given for type and id
const relval1 = {
data: {
type: "staff",
id: "1",
attributes: {
name: 'JavaScript'
}
}
};
const relval2 = {
data: {
type: "staff",
id: "2",
attributes: {
name: 'jQuery'
}
}
};
//the variable 'relval3' pushes the data to 'relval1' and 'relval2'
const relval3 = Ember.A();
relval3.pushObject(relval1);
relval3.pushObject(relval2);
export default ApplicationAdapter.extend ({
findRecord(store, type, id) {
//finds the item id and returns to 'relval3' variable
let valret = relval3.find(function (item) {
return id === Ember.get(item, 'data.id');
});
//the searched item will passed to 'relval3' from 'valret' variable
return valret;
}
});
建立兩個名為賬戶和員工的模型。開啟 app/models/account.js 檔案幷包含以下程式碼 −
import DS from 'ember-data';
import Model from "ember-data/model";
import attr from "ember-data/attr";
//defines one-to-one and one-to-many relationship between models
import { belongsTo, hasMany } from "ember-data/relationships";
export default DS.Model.extend({
//when async is 'true', it will fetch related entries
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 ({
//specifying attributes using 'attr()' method
name: attr()
});
接下來,建立一個路由並將其命名為 application.js。開啟此檔案,該檔案建立在 app/routes/ 下並新增以下程式碼 −
import Ember from 'ember';
export default Ember.Route.extend ({
model(){
//returns the value of model() hook
return this.get('store').findRecord('account', 100); //retrieve a record for specific id
}
});
使用以下命令建立一個名為應用程式的序列化器 −
ember generate serializer serializer_name
開啟 app/serializers/application.js 檔案並新增以下程式碼 −
import DS from 'ember-data';
//it is the default serializer and works with JSON API backends
export default DS.JSONAPISerializer.extend ({
//keyForRelationship() method overwrites the naming conventions
keyForRelationship: function(key, relationship, method) {
return Ember.String.camelize(key); //returns the lowerCamelCase form of a string
}
});
開啟 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 伺服器;您將收到以下輸出 −
emberjs_model.htm
廣告