1

Szenario Haken:Anruf Meteor.call() und warten innen `vor: insert`

Ich versuche, eine Appointment für einen Kunden einfügen nur mit autoform wenn die Termine kollidieren nicht. Unten ist der Code um eine kurze Idee zu bekommen.

{{#autoForm id='insertAppointmentForm' collection=appointment type="insert" 
       doc=this validation="browser"}} 
    <fieldset> 
     <!-- All fields here --> 
    </fieldset> 
    <button type="submit" class="btnn"> Create </button> 
{{/autoForm}} 

I Haken wie unten oben Autoform insert Code ist Hinzufügen

var hooksObject = { 
    before: { 
    insert: function(doc) { 
     console.log(doc); 
     Meteor.call('checkAppointmentClash', doc, function(error, response){ 
      if(error){ } else { } 
     }); 
     return doc; // I want to wait here 
    } 
    }, 
    onSuccess: function(formType, result) {}, 
    onError: function(formType, error) {} 
}; 

AutoForm.addHooks(['insertAppointmentForm'], hooksObject, true); 

Problem:

Das Problem hier ist, dass Form selbst abgegeben wird, wenn error von Meteor.call() und Einsätzen zurück die document zur Datenbank. Ich weiß, dass der Meteor.call() asynchronen Anruf ist, aber wie kann ich auf das Ergebnis warten? nur dann möchte ich mit submit fortfahren, wenn kein fehler auftritt.

Antwort

2

Hooks können asynchron arbeiten. Von der documentation:

Diese Funktionen können bei Bedarf asynchrone Aufgaben ausführen. Wenn keine Asynchronität erforderlich ist, geben Sie einfach das Dokument oder den Modifikator zurück oder geben Sie false zurück, um die Übertragung abzubrechen. Wenn Sie nichts zurückgeben, müssen Sie schließlich this.result() aufrufen und das Dokument oder den Modifikator oder false übergeben, um die Übermittlung abzubrechen.

So könnte der Code wie folgt aussehen:

insert: function(doc) { 
    // note using() => {} to bind `this` context 
    Meteor.call('checkAppointmentClash', doc, (error, response) => { 
    if(error) { 
     this.result(false); 
    } else { 
     this.result(doc); 
    } 
    }); 
    // return nothing 
} 

Obwohl, ich würde vorschlagen, Sie fließen zu überdenken. Es ist falsch, nach "Zusammenstoß" in einem Haken zu suchen. Sie sollten dies im Schritt "Benutzer eingegebene Daten" tun und die Schaltfläche "Senden" aktivieren/deaktivieren.

+0

Überprüfung der Kollision auf "Benutzer eingegebene Daten" ist nicht eine machbare Lösung in Bezug auf die Leistung (auch wenn ich '_.debounce', um Anfragen zu steuern). Wenn Sie es auf Anhieb prüfen, wird nur ein Anruf an den Server gesendet, der den Anforderungen meiner Anwendung entspricht. –

+0

@AnkurSoni Ich meine nicht "kontinuierlich prüfen", nur einmal, wenn der Benutzer bereits Daten in das Feld eingegeben hat. Natürlich wäre das bedeutungslos, wenn Sie _alle_ Felder benötigen, um nach dem Konflikt zu suchen :) – Styx