2012-04-23 11 views
8

Sto provando a vedere come posso richiamare una funzione js dopo che il client ottiene un risultato da una chiamata al metodo Meteor. L'unica cosa che sono riuscito a ottenere è invocare la funzione myFunc solo sul client che ha effettuato la chiamata al metodo effettivo. Qualche idea su come posso richiamare la funzione su tutti i client attualmente abbonati?Richiamare una funzione js del client in Meteor dopo aver ottenuto i risultati dal server

ecco il codice:

function myFunc(error, result) { 
    alert(result); 
} 
if (Meteor.is_client) { 

    Template.container.events = { 
    'click input' : function() { 
     Meteor.call('someMethod',myFunc); 
     if (typeof console !== 'undefined') 
     console.log("You pressed the button"); 
    } 
    }; 
} 



if (Meteor.is_server) { 
    Meteor.startup(function() { 
    // code to run on server at startup 
    }); 
} 

Meteor.methods({ 
    someMethod: function() { 
    //console.log(!this.is_simulation); 
    return "something"; 
    } 
}) 

Grazie

risposta

11

Attualmente non è possibile trasmettere una chiamata di metodo a tutti i clienti direttamente. Almeno per quanto posso dire. Ma una soluzione potrebbe essere quella di creare una raccolta denominata Avvisi e monitorarla per le modifiche. Poi, quando si desidera inviare un messaggio a tutti gli utenti è possibile modificare il documento Avvisi:

Cliente:

Alerts = new Meteor.Collection("alerts") 

Meteor.autosubscribe(function() { 
    Alerts.find().observe({ 
    added: function(item){ 
     alert(item.message); 
    } 
    }); 
}); 

Server:

Alerts = new Meteor.Collection("alerts") 

Meteor.publish("alerts", function(){ 
Alerts.find(); 
}); 

Alerts.remove({}); // remove all 
Alerts.insert({message: "Some message to show on every client."}); 
+2

Grazie usando la funzione osservare() sul client ha fatto il trucco. – Gavriguy

+0

@greg, hai sbagliato a digitare Meteor sul codice server. –

+0

@greg, oh, e collezione, dovrebbero essere Raccolta –

2

Un'altra opzione sta usando Meteor Stream package che ha lo scopo di evitare l'uso di una raccolta mongodb sul lato server. Supporta client per client, server per client, client per server AND server per server di messaggistica, incluso un supporto per Meteor Cluster

Se si desidera rimanere con meteor solo utilizzando le raccolte, il codice seguente consente di trasmettere un messaggio dal client a tutti i client o un messaggio dal server a tutti i client sottoscritti. Basta usare questo meccanismo per attivare una funzione sul lato client una volta ricevuto il messaggio giusto. Il codice è realizzato in modo tale da non avere mai oggetti inutili rimasti nella collezione.

Messages = new Meteor.Collection("messages"); 

if (Meteor.isClient) { 

    Meteor.subscribe("messages"); 

    var query = Messages.find({}); 
    var handle = query.observe({ 
     added: function(document) 
     { 
      console.log(document.message); 
     } 
    }); 

    // Test the mechanism from the client side 
    Meteor.call("client talked"); 
} 

if (Meteor.isServer) { 
    Meteor.startup(function() { 
     Messages.remove({}); 
    }); 

    Meteor.publish("messages", function() 
    { 
     // you might add an optional filter in order to broadcast only the messages you want to the client 
     return Messages.find(); 
    }); 

    function talk(message) 
    { 
        var id = Messages.insert({"message":message}); 
        Messages.remove(id); 
    } 

    Meteor.methods(
      { 
       talk: function(message) 
       { 
        // you might filter here if the clients can talk using this.userId 
        talk(message); 
       } 
      }); 

    // test the mechanism from the server side 
    talk("server talked"); 
} 
0

mi approccio semplice per chiamare una funzione JavaScript lato client potrebbe essere quella di aggiungere un tag script nel template HTML che è vincolato da vostra collezione. Ogni volta che viene inserito un nuovo elemento, questo tag verrà inserito nel client eseguirà la tua funzione. Ho una raccolta chiamata caricamenti con alcune proprietà come nome. Il modello seguente innesca drawpoints() funzione sul lato client al momento della ricezione di un nuovo elemento nella collezione Upload:

{{#each uploads}} 
     <tr> 
      <td>{{name}}</td> 
      <td> 
       <div class="alert alert-success"><a href="{{url download=true}}">Download Here</a></div> 
      </td> 
     </tr> 
     <script>drawpoints();</script> 
    {{/each}} 
Problemi correlati