6

In meinem Stacks Schema habe ich eine dimensions Eigenschaft als solche definiert:Verwendung von Objekten als Optionen in Autoform

dimensions: { 
    type: [String], 
    autoform: { 
     options: function() { 
      return Dimensions.find().map(function(d) { 
       return { label: d.name, value: d._id }; 
      }); 
     } 
    } 
} 

Das funktioniert wirklich gut, und mit mongolisch ich bin in der Lage zu sehen, dass ein Versuch zum Einfügen von Daten durch die Form hat gut funktioniert (in diesem Fall habe ich zwei Dimensionen einfügen zu)

Mongol image

aber was ich wirklich, welche Daten ist, dass die tatsächliche Dimension Objekt speichert, anstatt sie Schlüssel ist. Etwas wie folgt aus:

[Mongol good[2]

Um zu versuchen, dies zu erreichen, ich type:[String]-type:[DimensionSchema] und value: d._id-value: d geändert. Das Denken hier, dass ich der Form sage, dass ich ein Objekt erwarte und jetzt das Objekt selbst zurückgebe.

Allerdings, wenn ich dies ausführen, bekomme ich den folgenden Fehler in meiner Konsole.

Meteor unterstützt derzeit keine Objekte unterstützen andere als ObjectID als ids

Stochern ein wenig und wechselnden type:[DimensionSchema]-type: DimensionSchema ich einige neue Fehler in der Konsole sehen (vermutlich sie begraben werden, wenn die type ist ein Array

console image

So scheint es, dass Autoform versucht, den Wert zu übernehmen ich in th gespeichert werden soll die Datenbank und versuchen, das als ID zu verwenden. Irgendwelche Gedanken über den besten Weg, dies zu tun ?.

als Referenz hier ist mein DimensionSchema

export const DimensionSchema = new SimpleSchema({ 
    name: { 
     type: String, 
     label: "Name" 
    }, 
    value: { 
     type: Number, 
     decimal: true, 
     label: "Value", 
     min: 0 

    }, 
    tol: { 
     type: Number, 
     decimal: true, 
     label: "Tolerance" 
    }, 
    author: { 
     type: String, 
     label: "Author", 
     autoValue: function() { 
      return this.userId 
     }, 
     autoform: { 
      type: "hidden" 
     } 
    }, 
    createdAt: { 
     type: Date, 
     label: "Created At", 
     autoValue: function() { 
      return new Date() 
     }, 
     autoform: { 
      type: "hidden" 
     } 
    } 
}) 
+0

Haben Sie [this] (https://github.com/aldeed/meteor-autoform/issues/798) Problem gesehen? – MasterAM

+0

@MasterAM nein. Das deckt es ziemlich ab. Danke, dass du mich geschlossen hast. – Chris

+1

Frage ist, sind Sie sicher, dass Sie das gesamte Dokument einbetten möchten? Vielleicht brauchen Sie nur eine Teilmenge? Gibt es eine Chance, dass sich eine "Dimension" in Zukunft ändert (und wenn ja, wie planen Sie, die verschachtelten Dokumente auf eine wartbare Art und Weise zu aktualisieren)? Sie können auch eine Meteor-Methode verwenden, um mit dem Formular umzugehen und alles dort zu tun. – MasterAM

Antwort

1

Nach meiner Erfahrung und aldeed selbst in this issue, AutoForm ist nicht sehr freundlich zu Feldern, die Arrays von Objekten sind.

Ich würde generell davon abraten, diese Daten so einzubetten. Es macht die Daten schwieriger zu pflegen, falls ein dimension Dokument in der Zukunft geändert wird.

Alternativen

  • Sie ein Paket wie publish-composite verwenden können, ein reaktives-Join in einer Publikation zu erstellen, während nur die _id s in den stack Dokumente einbetten.
  • Sie können etwas wie das PeerDB Paket verwenden, um die De-Normalisierung für Sie durchzuführen, die auch verschachtelte Dokumente für Sie aktualisieren wird. Berücksichtigen Sie, dass es mit einer Lernkurve kommt.
  • Codieren Sie manuell die spezifischen Formulare, die nicht einfach mit AutoForm erstellt werden können. Dies gibt Ihnen maximale Kontrolle und manchmal ist es einfacher als all das Basteln.

wenn Sie darauf bestehen, Autoform

Während es möglich sein kann create a custom input type (via AutoForm.addInputType()), würde ich es nicht empfehlen. Es würde erfordern, dass Sie eine Vorlage erstellen und die Daten in seiner valueOut Methode ändern und es wäre nicht sehr einfach, Bearbeitungsformulare zu generieren.

Da dies ein spezifischer Anwendungsfall ist, glaube ich, dass der beste Ansatz ist es, ein leicht modifizierte Schema zu verwenden und die Daten in einer Meteor Methode zu behandeln.

Definieren Sie ein Schema mit einer Reihe von Strings:

export const StacksSchemaSubset = new SimpleSchema({ 
    desc: { 
    type: String 
    }, 
    ... 
    dimensions: { 
    type: [String], 
    autoform: { 
     options: function() { 
     return Dimensions.find().map(function(d) { 
      return { label: d.name, value: d._id }; 
     }); 
     } 
    } 
    } 
}); 

Dann machen eine Quickform, ein Schema und ein Verfahren anzugeben:

<template name="StacksForm"> 

    {{> quickForm 
    schema=reducedSchema 
     id="createStack" 
     type="method" 
     meteormethod="createStack" 
     omitFields="createdAt" 
    }} 

</template> 

und definieren Sie die entsprechenden Helfer das Schema zu liefern:

Template.StacksForm.helpers({ 
    reducedSchema() { 
    return StacksSchemaSubset; 
    } 
}); 

Und auf dem Server, definieren Sie die Methode und mutieren die data vor dem Einfügen.

Meteor.methods({ 
    createStack(data) { 
    // validate data 
    const dims = Dimensions.find({_id: {$in: data.dimensions}}).fetch(); // specify fields if needed 
    data.dimensions = dims; 
    Stacks.insert(data); 
    } 
}); 
0

Das einzige, was ich in diesem Moment raten kann (wenn die Werte müssen nicht object Typen unterstützen), Objekt in string (dh serialisierten String) und eingestellt zu konvertieren sind, dass als Wert für "Dimensionen" Schlüssel (anstelle von Objekt) und speichern Sie das in DB.

Und während wir von db zurückkommen, einfach unseren Wert (string) wieder in object.

Verwandte Themen