[英]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.