5

在我的 ember-model 模型中,我需要从枚举中设置一个 String 属性。ember模型可以吗?

通过示例我想要一个 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;
4

2 回答 2

6

如文档中所述:

在 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.Enumerablemixin 并遵循以下两个要求:

  • 你必须length有财产。每当您的可枚举对象中的项目数发生变化时,该属性都应该发生变化。如果您将其与Ember.Object子类一起使用,则应确保length使用内置set()方法更改属性。

  • 如果你必须实施nextObject().

一旦你实现了这两个方法,将Ember.Enumerablemixin 应用到你的类中,你将能够像任何其他集合一样枚举对象的内容。

伪代码:

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})
于 2013-08-05T17:27:02.173 回答
0

对于 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"

你可以像这样添加一个mixin 风格的 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 约定,而不是问题的旧全局样式

于 2017-02-02T16:10:26.693 回答