8

我正在尝试查看在客户端从 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

4 回答 4

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."});
于 2012-04-23T06:08:16.763 回答
2

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

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

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");
}
于 2014-04-06T06:13:13.877 回答
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

于 2013-08-10T01:33:39.847 回答
0

我调用 JavaScript 客户端函数的简单方法是在您的集合绑定的 html 模板中添加一个脚本标记。每当插入新项目时,此标签都会插入到客户端中以运行您的功能。我有一个集合调用上传,其中包含一些属性,例如name。以下模板在 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}}
于 2015-08-03T23:19:05.097 回答