繁体   English   中英

如何使用 ember-model 定义枚举

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM