Ich habe ein Projekt tun etwas Ähnliches bekam. Es hat mehrere Kernfelder, aber Benutzer können ihre eigenen Felder hinzufügen, die alle dynamisch gerendert werden. Wir speichern die Felder als json in einer Tabelle section_schema mit 4 Spalten: | id | Abschnittsname | Schema | disable
Das Schema enthält alles, was wir benötigen, um die dynamische Form zu rendern. Einige der spezifischen Formatierungen für unsere Kerndaten werden etwas klobig, aber es funktioniert ziemlich gut. Ich übersprang die Vorbereitungen, die wir im Backend machen, weil ich nicht wollte, dass das zu lange dauerte. Hier sind die Grundlagen:
Grund json in section_schema:
{
"Company Name":{
"cols":"8",
"field_name": "company_name",
"type":"string",
"order":"0",
"required":"1"
},
"Member Type":{
"cols":"4",
"field_name": "member_type",
"type":"dropdown_fromdata",
"order":"1",
"required":"1",
"dropdown":{"table" : "membershipType", "field": "name"}
},
"Website":{
"cols":"4",
"field_name": "company_website",
"type":"string",
"order":"2",
"required":"0"
},
... others
in vue Komponente:
<div class="col-sm-6" v-for="v in dataType">
<div class="white-box">
<h3 class="box-title">{{v.section_name}}</h3>
<form class="form-material form-horizontal m-t-30" :id="v.section_id">
<input type="hidden" :value="v.section_id" id="type" name="type">
<div class="form-group" v-for="i in v.field_data">
<label class="col-md-12" :for="i.id">{{i.name}}</span></label>
<div class="col-md-12">
<select v-if="i.id === 'company_info-member_type'" class="form-control" style="width: 100%;" size="1" :value="i.value" :id="i.id" :name="i.id">
<option value="" selected disabled>Please select</option>
<option v-for="mt in membershipTypes" :value="mt.name">{{mt.name}}</option>
</select>
<select v-else-if="i.id === 'company_info_status'" class="form-control" style="width: 100%;" size="1" :value="i.value" :id="i.id" :name="i.id">
<option value="" selected disabled>Please select</option>
<option v-for="status in statuses" :value="status.name">{{status.name}}</option>
</select>
<datepicker v-else-if="i.id === 'company_info-anniversary'" :format="format" :value="setDate(i.value)" :id="i.id" :name="i.id"></datepicker>
<input v-else-if="i.type == 'phone'" :type="i.type" :id="i.id" :name="i.id" class="form-control" :placeholder="i.name" :value="i.value" data-mask="(999) 999-9999">
<input v-else :type="i.type" :id="i.id" :name="i.id" class="form-control" :placeholder="i.name" :value="i.value">
</div>
</div>
<button @click.prevent="saveMemberChanges(v.section_id)" class="btn btn-info waves-effect waves-light m-r-10">Submit</button>
</form>
</div>
</div>
Edit: weitere Informationen
Unsere Daten:
data() {
return {
dataType: [],
}
},
methods: {
getDataTypes: function(){
var id = this.member.id
this.$http.get('/member/details/json/'+id).then((response) => {
var data = response.data
this.dataType = data
}, (response) => {
...
});
},
}
Es ist schwer zu sagen, weil ich wh nicht weiß bei der Struktur Ihrer Daten ist und welche Form Felder Sie von API senden. Stellen Sie sich vor, Sie erhalten Daten von API und Sie werden natürlich dynamisch speichern sie in Datenobjekt - Modell. Dann können Sie über jedes Objekt aus der Antwort in Ihrem Array iterieren und dynamisch zuweisen Modell für jeden Wert - Eingabefeld - hier klicken http://jsbin.com/kugazopuwu/1/edit?html,js,console,output Hoffe ich verstand gut Ihr Problem, wenn nicht Sorry –
Hallo danke für Ihre Antwort - Ihre Antwort ist gut, obwohl VueJS verwendet wird, um alle Formularelemente zu rendern. Aus Sicherheits- und Latenzgründen muss die gesamte Feldgenerierung über Blade-Vorlagen in Laravel erfolgen. – Oxid3
hmm .. Ich kann keine Fehler sehen auf v-model = "form.item.item2" http://jsbin.com/laduyaqummi/edit?html,js,console,output –