Frage

Ich habe es versucht um diesen Beitrag zu diesem Konzept zu verstehen, Ich verstehe es jedoch nicht.Ich habe das folgende einfache Setup:

/server/test.js
Meteor.methods({ 
  abc: function() {
    var result = {};
    result.foo = "Hello ";
    result.bar = "World!";
    return result;
  }
});

/client/myapp.js
var q = Meteor.call('abc');
console.log(q);

Diese Struktur kehrt zur Konsole zurück undefined.

Wenn ich das ändere myapp.js datei an:

Meteor.call('abc', function(err, data) {
  !err ? console.log(data) : console.log(err);
}

Ich erhalte die Object in meiner Konsole.

Idealerweise ist es das, was ich gerne tun würde, aber es funktioniert nicht, wenn ich es in der Konsole angebe: Cannot read property 'greeting' of undefined

/client/myapp.js
var q = Meteor.call('abc');

Template.hello.greeting = function() {
   return q.foo;
}

Jede Hilfe bei der Übergabe der Daten vom Serverobjekt an die Vorlage wäre sehr dankbar.Ich lerne immer noch JavaScript & Meteor.

Danke!

War es hilfreich?

Lösung

Von der Meteor.call Dokumentation:

Wenn Sie auf dem Client keinen Rückruf übergeben und sich nicht in einem Stub befinden, gibt call undefined , und Sie haben keine Möglichkeit, den Rückgabewert der Methode abzurufen.Das liegt daran, dass der Client keine Fasern hat, so dass es eigentlich keine Möglichkeit gibt, die Remote-Ausführung einer Methode zu blockieren.

Also, du wirst es so machen wollen:

Meteor.call('abc', function(err, data) {
  if (err)
    console.log(err);

  Session.set('q', data);
});

Template.hello.greeting = function() {
  return Session.get('q').foo;
};

Dadurch wird die Vorlage reaktiv aktualisiert, sobald die Daten verfügbar sind.

Andere Tipps

Dies geschieht, weil Npm.require hat asynchrones Verhalten.Das ist der Grund, warum Sie einen Rückruf schreiben müssen Meteor.call.

Aber es gibt eine Lösung, benutze einfach install(mrt add npm) und Sie erhalten eine Funktion namens Meteor.sync(//...) damit kannst du beide Spiele machen:sync und async in Ihrem Meteor.call().

Referenz: http://www.sitepoint.com/create-a-meteor-app-using-npm-module/

Sie können den Rückgabewert einer Meteor-Methode zur Verwendung in einer Vorlage mithilfe von a abrufen reaktive Variable.Schauen Sie sich die arbeitsdemonstration auf Meteorpad

Ich habe mich für eine Ghettolösung entschieden.Aber es funktioniert für mich, was für mich wichtig ist.Unten ist mein Code, der meiner Meinung nach das Problem von OP löst.

In der Hauptsache des Kunden.js:

Meteor.setInterval(function() {
    confirmLogin();

}, 5000); 

Dies führt die Funktion confirmLogin () alle fünf Sekunden aus.

Die Funktion confirmLogin (im Hauptfenster des Clients.js):

function confirmLogin() {
    Meteor.call('loggedIn', function (error, result) {
        Session.set("loggedIn", result);
    });

}

Die angemeldete Methode (in der Hauptversion des Servers.js):

loggedIn: function () {
    var toReturn = false;
    var userDetails = Meteor.user();
    if (typeof userDetails["services"] !== "undefined") {
        if (typeof userDetails["services"]["facebook"] != "undefined") {
            toReturn = true;
        }
    }

    return toReturn;
},

Der relevante Helfer:

loggedIn: function () {
    return Session.get("loggedIn");
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top