2016-07-18 3 views
0

Ich versuche, ein Dokument in meinem Template.admin.events-Code zu finden. Ich habe ein Formular und onClick Ich möchte überprüfen, ob die ID der ObjectID eingegeben ist ein vorhandenes Dokument in meiner Sammlung und holen Sie dieses Ergebnis, um es in der Vorlage anzuzeigen.Richtige Methode zum Suchen eines Dokuments im Vorlagenereignis?

Mein Ereigniscode auf dem Client:

Template.admin.events({ 
    'click #btnAjouterObjet'(event) { 
      let objetIdInput = $('#object_id').val().toString(); 
      Meteor.subscribe('objetsFindOne', objetIdInput, { 
       onReady: function() { 
        let obj = Objets.findOne(); 
        if (obj) { 
         console.log("found"); 
         console.log(obj); 
         objetsArr.push(objetIdInput); 
        } 
        else { 
         console.log("not found"); 
         console.log(obj); 
        } 
       } 
      }); 
     } 
}); 

In meiner Objets api:

Meteor.publish('objetsFindOne', function objetsFindOne(param_id){ 
    return Objets.find({_id : param_id}); 
    }) 

ich überprüft haben, und meine objetIdInput immer auf Klick ändern, wenn eine andere ID eingegeben wird, die aber subscribe immer Gibt die erste eingegebene ID zurück. Ich habe auch das onReady hinzugefügt, weil es andernfalls undefined zurückgegeben wurde.

Ich bin neu bei Meteor und ich habe auch versucht, die ganze Sammlung zu abonnieren und den Fund auf dem Client zu tun, aber ich denke nicht, dass es die beste Idee ist, da meine Sammlung ungefähr 22000 Dokumente hat.

+0

Das Abo einige Zeit dauert, aber ich kann nicht herausfinden, wie man darauf wartet, dass es fertig ist, bevor der Rest des Codes ausgeführt wird. –

Antwort

2

nur ein wenig auf der ersten Antwort zu erarbeiten, wie dieses Muster zu ändern:

(1) Sie sollten Ihren Meteor.subscribe() Anruf in Ihrer Template.admin.onCreated() Funktion setzen.

(2) Die Subskription liest von einem reaktiven Wert, z. B. new ReactiveVar().

(3) Jetzt, zu jeder Zeit, an der sich der reaktive Wert ändert, wird das Abonnement erneut ausgeführt. In Ihrem Schablonenereignis legen Sie den reaktiven Wert auf die ID fest, und das Abonnement behandelt den Rest.

Entdecken Sie Meteor und andere Ressourcen sollten bei allen Details hilfreich sein.

0

ich für die Verwendung eines Verfahrens entschieden:

Kunde:

'click #btnAjouterObjet'(event) { 
     let objetIdInput = $('#object_id').val().toString(); 
     let result = Meteor.call('findObj', objetIdInput, function (error, result) { 
      if (error) { 
       console.log(error.reason); 
       return; 
      } 
      console.log(result); 
     }); 
    } 

Auf der Serverseite:

Meteor.methods({ 
findObj: function (param_id) { 
     console.log(Objets.find({ _id: param_id }).fetch()); 
     return Objets.find({ _id: param_id }).fetch(); 
    }, 
}); 
+0

Das ist eine sehr nicht-kometenhafte Möglichkeit, dieses Problem anzugehen, da Sie die Reaktionsfähigkeit umgangen haben. @ Jeremy S hat die richtige Lösung. –

+0

Sie hatten Recht. Ich habe das Konzept der Reaktivität im Meteor bis zu diesem Problem nicht verstanden. ReactiveVar ist der richtige Weg! –