[英]How to define an enumeration with ember-model
在我的 ember-model 模型中,我需要從枚舉中設置一個 String 屬性。 用余燼模型可以嗎?
通過示例,我想要一個 Book 模型:
App.Book({
id: Ember.attr(),
title: Ember.attr( 'String' ),
author: Ember.attr( 'String' ),
status: App.BookStatus
});
和App.Book.Status
作為具有 3 個可能值"FREE", "BORROW", "LOST"
的枚舉並使用它:
var myBook = App.Book.create({
title:'myBook',
author:'fred',
status: App.BookStatus.FREE
})
我需要等效於 Java Enum 功能
public enum BookStatus {
FREE, BORROW, LOST
}
class Book {
BookStatus bookStatus;
}
Book bookInstance = new Book();
bookInstance.bookStatus=BookStatus.LOST;
如文檔中所述:
在 Ember.js 中,Enumerable 是包含多個子對象的任何對象,它允許您使用 Ember.Enumerable API 處理這些子對象。
例如:
var players = ["Alex", "Paul", "Tom"];
players.forEach(function(item, index) {
console.log('Player %@: %@'.fmt(index+1, item));
});
會輸出:
// Player 1: Alex
// Player 2: Paul
// Player 3: Tom
要使您自己的自定義類可枚舉,您需要兩個項目:
要在 ember 中創建自己的可枚舉類/對象,您可以使用Ember.Enumerable
mixin 並遵循以下兩個要求:
你必須有一個length
屬性。 只要可枚舉對象中的項目數發生變化,此屬性就會發生變化。 如果您將它與Ember.Object
子類一起使用,您應該確保使用內置的set()
方法更改length
屬性。
如果您必須實現nextObject()
。
實現這兩個方法后,將Ember.Enumerable
混入應用到您的類,您將能夠像枚舉任何其他集合一樣枚舉對象的內容。
偽代碼:
App.MyEnumObject = Ember.Object.extend(Ember.Enumerable, {
length: 0,
nextObject: function() {
//return the next object of the enumeration
}
//more methods and properties
});
有關 ember 中可枚舉的更多信息,請參見此處。
希望能幫助到你。
由於我們使用的是 javascript,因此您可以以更簡單的方式完成您想要做的事情。 例如:
App.bookStatus = {
FREE: "FREE",
BORROW: "BORROW",
LOST: "LOST"
}
var myBook = App.Book.create({id: 1, title: 'myBook', author: 'fred', status: App.bookStatus.FREE})
對於 Ember 中的簡單枚舉,只需使用一個簡單的 JavaScript 對象,如@intuitivepixel 答案的底部所示就足夠了,但是您可以使用 ember-computed-enum獲得更多功能的 Ember 風格的枚舉。
它允許通過更 JavaScript 風格友好的名稱獲取和設置:
myBook.get('status'); // -> 'free'
myBook.set('status', 'lost');
myBook.get('status'); // -> 'lost'
myBook.save(); // -> saves `status: "LOST"` to the server
還添加了在模板中特別有用的enumNameIsValue
屬性:
myBook.get('statusIsLost'); // -> true
myBook.get('statusIsFree'); // -> false
用ember install ember-computed-enum
,然后使用就很簡單了
假設您的模型看起來像:
// app/models/book.js
import DS from 'ember-data';
export default DS.Model.extend({
title: DS.attr('string'),
author: DS.attr('string'),
statusCode: DS.attr('string')
});
從服務器返回statusCode
作為"FREE"
、 "BORROW"
或"LOST"
你可以像這樣添加一個混合風格的 Ember 枚舉:
// app/models/book.js
import DS from 'ember-data';
import { computedEnumMixin } from 'ember-computed-enum';
BOOK_STATUS_ENUM = {
free: "FREE",
borrow: "BORROW",
lost: "LOST"
};
export default DS.Model.extend(
computedEnumMixin('status', 'statusCode', BOOK_STATUS_ENUM),
{
title: DS.attr('string'),
author: DS.attr('string'),
statusCode: DS.attr('string')
});
如果您無法在 API 中將status
字段的名稱更改為statusCode
,並且仍想使用名稱status
來訪問代碼中的值,則可以使用序列化程序重新映射模型字段名稱:
// app/serializers/book.js
import DS from 'ember-data';
export default DS.JSONAPISerializer.extend({
attrs: {
statusCode: 'status' // map the API's "status" field to the "statusCode" field on the model
}
});
注意:我已經制作了示例以反映當前(2017 年 2 月)的 ember-cli 約定,而不是問題的較舊的全局樣式
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.