2016-06-30 5 views
0

Im kämpfen, um Array von Saiten in Mongo Db Sammlung einfügen.Meteor Einfügen Array von Saiten in collection2

sein Kommen mit einem Fehler auf insert failed: Error: Address must be a string

EDIT

ich dynamische Formularfelder für CCs und Teilnehmer am erzeugen und müssen diese Werte in einem Array speichern.

hier das jQuery-Schnipsel:

$(function(){ 
    $(document).on('focus', 'div.form-group-options div.input-group-option:last-child input', function(){ 
    var sInputGroupHtml = $(this).parent().html(); 
    var sInputGroupClasses = $(this).parent().attr('class'); 
    $(this).parent().parent().append('<div class="'+sInputGroupClasses+'">'+sInputGroupHtml+'</div>'); 
    }); 
    $(document).on('click', 'div.form-group-options .input-group-addon-remove', function(){ 
    $(this).parent().remove(); 
    }); 
}); 

html:

<form class="row form-horizontal newMeeting"> 
    <div class="form-group form-group-options col-xs-11 col-md-3" id="cc"> 
    <div class="input-group input-group-option col-xs-12"> 
     <input type="text" name="option[]" class="form-control" id="cc" placeholder="CCs"> 
     <span class="input-group-addon input-group-addon-remove"> 
     <span class="glyphicon glyphicon-remove"></span> 
     </span> 
    </div> 
    </div> 

    <div class="form-group form-group-options col-xs-11 col-md-3"> 
    <div class="input-group input-group-option col-xs-12"> 
     <input type="text" class="form-control" id="attendees" placeholder="Attendees"> 
     <span class="input-group-addon input-group-addon-remove"> 
     <span class="glyphicon glyphicon-remove"></span> 
     </span> 
    </div> 
    </div> 

    <div class="row no-print"> 
    <div class="col-xs-12">  
     <input type="submit" value="Save" class="btn btn-primary pull-right"> 
    </div> 
    </div> 
</form> 

mein Schema:

Emails = new Mongo.Collection('emails'); 


EmailSchema = new SimpleSchema({ 

"attendeesEmail": { 
    type: [Object], 
    optional: true 
}, 
"attendeesEmail.$.address": { 
    type: String, 
    regEx: SimpleSchema.RegEx.Email 
}, 
ccEmails: { 
    type: [Object], 
    optional: true 
}, 
"ccEmails.$.address": { 
    type: String, 
    regEx: SimpleSchema.RegEx.Email 
} 
}); 

Emails.attachSchema(EmailSchema); 

Veranstaltung:

Template.form.events({ 
'submit .newMeeting': function(event) { 
var cc = $('#cc').serializeArray(); 
var attendees = $('#attendees').serializeArray(); 
}); 

Insert:

Emails.insert({ 
    attendeesEmail: [{address: attendees}], 
    ccEmails: [{address: cc }] 
}); 

console.log(attendees); druckt [Object] Fehlermeldung sagt insert failed: Error: 0 must be a string

ich einige Lösungen versucht haben, aber konnte es nicht funktioniert, würden irgendwelche Vorschläge geschätzt.

Antwort

0

The .serializeArray() method creates a JavaScript array of objects, ready to be encoded as a JSON string

So cc, Teilnehmer sind Strings nicht

Sie können versuchen, toSource zu verwenden() -Methode:

var cc = $('#cc').serializeArray().toSource(); 
var attendees = $('#attendees').serializeArray().toSource(); 

Oder verwenden JSON.stringify Methode

var cc = JSON.stringify($('#cc').serializeArray()); 
var attendees = JSON.stringify($('#attendees').serializeArray()); 

Aber die ToSource-Methode funktioniert nicht auf Chrome, IE. Es funktioniert auf Firefox
API Here

<!DOCTYPE html> 
 
<html> 
 
<head> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script> 
 
<script> 
 
$(document).ready(function(){ 
 
$("button").click(function(){ 
 
    var x = $("form").serializeArray(); 
 
    alert(JSON.stringify($("form").serializeArray())); 
 
    $.each(x, function(i, field){ 
 
     $("#results").append(field.name + ":" + field.value + " "); 
 
    }); 
 
}); 
 
}); 
 
</script> 
 
</head> 
 
<body> 
 

 
<form action=""> 
 
    First name: <input type="text" name="FirstName" value="Mickey"><br> 
 
    Last name: <input type="text" name="LastName" value="Mouse"><br> 
 
</form> 
 

 
<button>Serialize form values</button> 
 

 
<div id="results"></div> 
 

 
</body> 
 
</html>

+0

dies das Problem nicht lösen, da die Daten als ein leeres Array gespeichert werden –

0

Sie das Problem lösen können Ihre Veranstaltungen wie diese mit der Aktualisierung.

Template.form.events({ 
    'submit .newMeeting': function(event) { 
    var cc = $('#cc').val(); 
    var attendees = $('#attendees').val(); 
}); 

Das Problem aufgrund auftritt zu serializeArray() Methoden, die die Zeichenfolge in ein Objekt konvertieren, Aber wenn Sie immer noch die serializeArray Methoden verwenden möchten, dann können Sie dieses

Template.form.events({ 
    'submit .newMeeting': function(event) { 
    var cc = $('#cc').serializeArray().value; 
    var attendees = $('#attendees').serializeArray().value; 
}); 
+0

Dank für Vorschlag, zuerst Code-Snippet behandelt mein Problem nicht, da es nur einzelne Werte speichert. In meinem Fall erstelle ich dynamische Formularfelder für CC und Teilnehmer. Daher wird ein Array dieser Werte benötigt. Die zweite Lösung speichert die Daten als leeres Array –

0

Die Art und Weise tun Sie definieren explizit, dass Ihr Schema falsch ist, insbesondere die Eigenschaften attendeesEmail und ccEmails.Wenn Sie es beabsichtigen, ein Array von Objekten zu sein, dann müssen Sie das Array von Objekten Schlüssel explizit wie folgt definieren:

Emails = new Mongo.Collection('emails'); 

EmailSchema = new SimpleSchema({ 
    "attendeesEmail": { 
     type: [Object], 
     optional: true 
    }, 
    "attendeesEmail.$.address": { 
     type: String, 
     regEx: SimpleSchema.RegEx.Email 
    }, 
    ccEmails: { 
     type: [Object], 
     optional: true 
    }, 
    "ccEmails.$.address": { 
     type: String, 
     regEx: SimpleSchema.RegEx.Email 
    } 
}); 

Emails.attachSchema(EmailSchema); 

Sobald Sie diese definiert Schema, dann können Sie den Einsatz mit dem folgenden Beispiel als Richtlinie umzusetzen. Dies setzt voraus, dass der Benutzer eine durch Semikola getrennte Liste von E-Mail-Adressen in die Texteingabe eingibt. Es verwendet den im Ereignishandler bereitgestellten Vorlagenbereich, der Code viel weniger fehleranfällig macht, indem er auf die Vorlage beschränkt. Dieser Ansatz ist eine etwas sauberere Methode, um Formulare in Meteor ohne alle globalen jQuery-Referenzen auszuführen.

Template Code:

<template name="foo"> 
    <form id="myform" class="newMeeting"> 
     <input type="text" name="attendees" /> 
     <input type="text" name="cc" /> 
     <input type="submit" id="submit" /> 
    </form> 
</template> 

Ereignishandler:

Template.foo.events({ 
    'submit form': function(event, template) { 
     event.preventDefault(); 

     var attendees = template.find("input[name=attendees]"), 
      cc = template.find("input[name=cc]"), 
      attendeesList = attendees.split(';').map(function (email){ 
       return { address: email } 
      }), 
      ccList = cc.split(';').map(function (email){ 
       return { address: email } 
      }); 


     // Do form validation 

     var data = { 
      attendeesEmail: attendeesList, 
      ccEmails: ccList 
     }; 

     // Clear form 
     attendees.value = ""; 
     cc.value = ""; 

     Emails.insert(data, function(err) { /* handle error */ }); 
    } 
}); 
+0

danke. Ich habe gerade die Frage aktualisiert, dynamische Formularfelder für CC und Teilnehmer generierend und müssen sie in Feld speichern –

+0

ich habe versucht, es als ein Objekt [Objekt] zu setzen, das war das erste Ding, das ich versucht habe und es behalten Fehler beim Einfügen werfen: Fehler: 0 muss eine Zeichenkette sein. –

+0

Ich habe mein Schema geändert, aber ich kann die Implementierung nicht funktionieren. Kannst du mir bitte darauf hinweisen? In meinem Fall gibt der Benutzer keine Semikolon-getrennte Liste von E-Mail-Adressen in der Texteingabe ein. Stattdessen gibt der Benutzer eine E-Mail in das brandneue dynamisch erzeugte Feld ein, wie in meiner Frage gezeigt –