2017-03-27 7 views
0

Ich arbeite an einem Datenmodell, das über eine Reihe vordefinierter Attribute verfügt, die immer vorhanden sein werden, und andere benutzerdefinierte Eigenschaften, die vom Benutzer definiert wurden.Eigenschaften dynamisch zu Ember definieren Datenmodell

Ein Unternehmen hat viele Rollen. Jedes Unternehmen, das dieses System verwendet, möchte benutzerdefinierte Eigenschaften für alle seine Rollen definieren, zusätzlich zu den festen Eigenschaften, die alle Rollen in verschiedenen Unternehmen haben.

Die Idee wäre, dass dann Nutzlast Rollen in json-api kommt mit allen Attributen, Sitte oder nicht:

{ 
    "id": "123", 
    "type": "roles", 
    "attributes": { 
    "name": "CEO", 
    "salary": 100000, 
    "favoriteColor": "blue" 
    } 
} 

In der obigen Rolle, name und salary sind Standardattribute, die in allen Rollen unabhängig Unternehmen, aber favoriteColor ist ein benutzerdefiniertes Attribut, das dem jeweiligen Unternehmen, das diese Rolle besitzt, als etwas definiert ist, das für alle seine Rollen benötigt wird.

ich mich, wenn ich mit so etwas wie dies mit Ember Daten wegkommen konnte, da ich nicht in der Lage sein, diese Gewohnheit zu definieren Attribute im Vorbild Definition:

// app/models/role.js 
export default DS.Model.extend({ 
    name: DS.attr('string'), 
    salary: DS.attr('number'), 
}) 

Um die Sache zu machen Schlimmer noch, die Idee ist, dass diese benutzerdefinierten Attribute nicht unbedingt Zeichenfolgenwerte sein müssen, aber sie können auch ihren Typ angeben. So ein Unternehmen möchte möglicherweise favoriteColor des Typs string, und auch birthDate des Typs date haben.

Antwort

1

Ich würde ein Attribut hinzufügen (Ihr Server müßte die zusätzlichen Parameter in einem config Attribute zurückzukehren):

// app/models/role.js 
export default DS.Model.extend({ 
    name: DS.attr('string'), 
    salary: DS.attr('number'), 
    config: DS.attr() // accepts anything, including json 
}) 

und

Option 1: die Serialisierung in die Attribute umgehen, indem Sie Ihre normalize Funktion Ihres benutzerdefinierten Serialisierers, der die Werte von config in die serialisierten Attribute verschiebt. Etwas wie folgt aus:

// serializers/role.js 
export default <Your Base Serializer>.extend({ 
     normalize(typeClass, hash) { 
      const result = this._super(typeClass, hash); 

      result.data.attributes = Object.keys(data.attributes.config).reduce((acc, value) => { 
       acc[value] = result.data.attributes.config[value]; 
       return acc 
      }, result.data.attributes); 

      return result; 
     }, 
    }); 

Option 2 (wenn Sie Ihre Auswahl beschränkt sind): verwenden, um die berechnete Funktion alias:

// app/models/role.js 
export default DS.Model.extend({ 
    name: DS.attr('string'), 
    salary: DS.attr('number'), 
    config: DS.attr(), // accepts anything, including json 

    favoriteColor: Ember.computed.alias('config.favoriteColor') 
}) 
0

Verwenden anpassbare jsona Datenformatierer, kann es um die Schaffung ember sehr hilfreich sein Datenmodelle automatisch. Es ist auch möglich, dass Sie auch von Ihren Ember-Datenmodellen automatisch ein korrektes JSON erstellen:

Verwandte Themen