从服务器获取结果后,在Meteor中调用客户端js函数

时间:2012-04-23 04:08:01

标签: meteor

我试图看看在客户端从Meteor方法调用中获取结果后如何调用js函数。我唯一能得到的是仅在进行实际方法调用的客户端上调用函数myFunc。 有什么想法我可以在所有当前订阅的客户端上调用该功能吗?

这是代码:

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

由于

4 个答案:

答案 0 :(得分:11)

目前,您无法直接向所有客户端广播方法调用。至少据我所知。但是,解决方法是创建一个名为Alerts的集合并监视它以进行更改。然后,当您要向所有用户发送消息时,您可以在警报中更改文档:

客户端:

Alerts = new Meteor.Collection("alerts")

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

服务器:

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

答案 1 :(得分:2)

另一种选择是使用Meteor Stream package,其目的是避免在服务器端使用mongodb集合。它支持客户端到客户端,服务器到客户端,客户端到服务器以及服务器到服务器的消息传递,包括对Meteor Cluster的支持

如果您只想使用集合继续使用meteor,则以下代码允许您从客户端向所有客户端广播消息,或者从服务器向所有订阅的客户端广播消息。只需使用此机制,然后在收到正确的消息后在客户端触发一个函数。代码的制作方式使您永远不会将无用的项目留在集合中。

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

答案 2 :(得分:0)

我喜欢Zeke所说的,但对于使用Meteor 0.5.0+的人来说,请使用Deps.autorun而不是autosubscribe ...详情请参阅: https://groups.google.com/forum/#!topic/meteor-core/mTa81RLvhbYhttp://www.meteor.com/blog/2013/02/14/meteor-055-devshop-code-and-community-contributions

答案 3 :(得分:0)

调用JavaScript客户端函数的简单方法是在您的集合绑定的html模板中添加脚本标记。无论何时插入新项目,此标记都将插入到客户端中以运行您的功能。我有一个收集调用上传,其中包含一些属性,例如名称。以下模板在收到Uploads集合中的新项目后触发 drawpoints()客户端功能:

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