【问题标题】:Getting a Meteor method to return a function?获取 Meteor 方法以返回函数?
【发布时间】:2014-08-27 21:09:32
【问题描述】:

我想定义一个服务器端 Meteor 方法,当调用该方法时,它将在客户端上运行一个函数。

下面的超简单示例-我希望此方法带有参数,并且在调用时将在客户端控制台上运行console.log(parameter)

Meteor.methods({

    consoleLogOnClient: function(text){
        var log = function(){ 
            console.log(text);
        };
        return log();
    }

});

但是当我这样做时:

Meteor.call('consoleLogOnClient', 'THIS MESSAGE SHOULD APPEAR ON THE CLIENT CONSOLE');

消息被记录在服务器控制台中,而客户端控制台中没有任何内容。

好的,很公平。也许我只是返回函数代码本身并将其存储在一个变量中然后运行它。但它也不起作用。

Meteor.methods({

    consoleLogOnClient: function(text){
        var log = function(){ 
            console.log(text);
        };
        return log;
    }

});

var myFunction = Meteor.call('consoleLogOnClient', 'THIS MESSAGE SHOULD APPEAR ON THE CLIENT CONSOLE');

myFunction();

【问题讨论】:

    标签: meteor


    【解决方案1】:

    http://docs.meteor.com/#meteor_methods

    它们应该返回一个 EJSON-able 值或抛出异常。

    EJSON:http://docs.meteor.com/#ejson

    因此,答案是您不能将函数从服务器发送到客户端,因为函数不是 EJSON 值。但你真正的问题可能是你想发送一个函数;我无法想象你为什么要这样做。而是发送数据。

    【讨论】:

    • 哦,我明白了。我想这是一个流星的东西。我正在研究一些表单验证的东西。以一个不能为空的文本字段为例。在客户端上验证很简单。但我也想在服务器上做同样的验证。当验证失败时,我想返回并使用 jQuery 自动运行一个函数,例如,突出显示文本框或其他内容。有点像捷径。
    • 如果客户端验证失败,请运行您的 jQuery 函数。如果您验证客户端上的所有内容,那么如果验证失败,您在服务器上的验证不需要返回任何内容,因为只有当用户没有在客户端上使用您的验证时它才会失败,这永远不会发生,除非用户是黑客。你和我在一起吗?
    【解决方案2】:

    您可以使用anticoders:client-call 包获得所需的结果。它允许您定义可以从服务器端运行的客户端方法。

    例如,如果你定义:

    Meteor.ClientCall.methods({
      'consoleLog': function(message) {
        console.log(message);
      },
    });
    

    并将 userId 设置为 clientId 用于方法:

    Deps.autorun(function() {
      Meteor.ClientCall.setClientId(Meteor.userId());
    });
    

    然后在服务器端你可以简单地调用:

    Meteor.ClientCall.apply(userId, 'consoleLog', ['THIS MESSAGE SHOULD APPEAR IN THE CLIENT CONSOLE']);
    

    【讨论】:

    • 谢谢!我之前检查过客户电话,现在我考虑了一下。嗯......似乎没有太多围绕客户呼叫的开发活动,所以这让我有点担心依赖它来完成我的项目。如果 Meteor 更新和客户呼叫中断,我会被搞砸的,不是吗?
    • 作为此软件包的开发人员,我可以向您保证,它并没有过时,只是在一段时间内没有必要升级。此外,它相当简单,所以如果出现问题,您自己调整应该不会有问题。
    • 再保证:刚出现的必要性,该包现在称为anticoders:client-call
    猜你喜欢
    • 2015-04-22
    • 2017-01-02
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多