我试图看看在客户端从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";
}
})
由于
答案 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/mTa81RLvhbY 和 http://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}}