2012-04-23 15 views
8

Estoy tratando de ver cómo puedo invocar una función js después de que el cliente obtiene un resultado de una llamada al método Meteor. Lo único que pude obtener es invocar la función myFunc solo en el cliente que realizó la llamada al método real. ¿Alguna idea de cómo puedo invocar la función en todos los clientes suscritos actualmente?Invocar una función de cliente js en Meteor después de obtener resultados del servidor

Aquí está el código:

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"; 
    } 
}) 

Gracias

Respuesta

11

Actualmente no se puede emitir una llamada de método a todos los clientes directamente. Al menos por lo que puedo decir. Pero una solución alternativa sería crear una colección llamada Alertas y supervisarla para ver los cambios. Entonces, cuando usted desea enviar un mensaje a todos sus usuarios puede cambiar el documento en Alertas:

Cliente:

Alerts = new Meteor.Collection("alerts") 

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

Servidor:

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

Gracias utilizando la función de observar() en el cliente hizo el truco. – Gavriguy

+0

@greg, escribiste mal Meteor en el código del servidor. –

+0

@greg, oh, y colección, debe ser Colección –

2

Otra opción es usar Meteor Stream package cuyo propósito es evitar el uso de una colección mongodb en el lado del servidor. Sí admite cliente a clientes, servidor a clientes, cliente a servidor Y servidor a servidores mensajería, incluyendo un soporte para Meteor Cluster

Si desea permanecer con meteor solo utilizando colecciones, el siguiente código le permite transmitir un mensaje del cliente a todos los clientes o un mensaje del servidor a todos los clientes suscritos. Simplemente use este mecanismo para disparar una función en el lado del cliente una vez que se reciba el mensaje correcto. El código está hecho de tal manera que nunca tendrás elementos inútiles en la colección.

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

me enfoque simple para llamar a una función JavaScript para el cliente sería añadir una etiqueta de script en la plantilla HTML que está obligado por su colección. Cada vez que se inserta un nuevo elemento, esta etiqueta se inserta en el cliente ejecutaría su función. Tengo una llamada de colección carga con algunas propiedades como nombre. La siguiente plantilla desencadena drawpoints() función de cliente a la recepción de un nuevo elemento de la colección cargas:

{{#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}} 
Cuestiones relacionadas