簡體   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