可以通过Collection.findOne调用Meteor方法调用

时间:2016-03-01 09:58:14

标签: meteor

在我的Meteor代码中。我可以在服务器上定义方法“或函数”并在客户端上的collectionName.findOne({id: 'someId'}).methodName;上调用它吗? 作为Meteor的新手,我不知道这是否可能,如果是这样,语法会是什么样子?谢谢

这段代码只是一个大脑转储。

//server
Meteor.method({
  doWork1: function (args) {
    //do work
    return something;
  }
});

MyCol = new Mongo.Collection('myCol');
MyCol.insert({item: "envelopes", qty : 100, myFunc: doWork1});

//client
Meteor.call(MyCol.findOne({item: 'envelops'}).myFunc;

已修改

Blaze Sahlzen的评论让我思考并添加以下内容。

我认为尝试mongo系列的原因是:

第一阶段:用户填写表单并单击一个按钮,输入值需要用作方法的参数,当成功返回时,表单会被修改以显示不同的输入字段以供用户再次填充然后单击相同按钮 第二阶段:与第一阶段相同,但再次使用不同的输入字段 阶段n:与阶段n-1相同,但再次具有不同的输入字段。

我需要存储所有输入值并按阶段标识符对它们进行分组 每种方法都可以为下一阶段添加/删除不同类型的输入控件。

由于将使用SAME按钮,因此我没有针对不同方法的不同按钮,因此我提出了我的原始问题“脑转储代码”。欢迎您重新发明或改变它并提供给您。 :)再次感谢。

已编辑2
一个实际的例子可能如下所示:

var stageOne = {};
//for each DOM input 
stageOne[inputName][i]= [inputValue][i];

myCol.insert({'stageOne': stageOne});
//then an observer for stageOne

但我无法理解如何使用正确的方法“链接”每个阶段而无需使用long if或switch条件语句。

2 个答案:

答案 0 :(得分:0)

你可以做的是使用observeChanges:

var query = MyCol.find({item: 'envelops'});
var handle = query.observeChanges({
    added: function () {
        somethingHappened();
    },
    changed: function () {
        somethingHappened();
    }
});

var somethingHappened = function(){
    // do something
}

查询包含你的集合,handle函数会自动检查是否对该集合进行了任何更改,如果存在则触发somethingHappened函数。

在somethingHappened中,您可以放置​​通常放在方法中的行为。

您可以在客户端和服务器端使用observeChanges,但在这种情况下,您只需要在服务器端。

答案 1 :(得分:0)

好吧,如果我理解你的意思,我认为你不需要观察变化。以下解决方案可能有点广泛,所以请耐心等待。

首先,您需要一个会话变量来控制客户端需要显示哪些表单值。您可以在Template.name.onRendered中引入此变量。

Session.set('stage',1);

然后你有输入字段

<form>
    <label id="label1">{{label1}}</label>
    <input id="field1" type="text"/>

    <label id="label1">{{label2}}</label>
    <input id="field2" type="text"/>

    <label id="label1">{{label3}}</label>
    <input id="field3" type="text"/>

    <button id="form-submit" type="submit"/>
</form>

我可以想象,当你进入不同的阶段时,你想要切换标签的名称以反映表格的变化。因此,您可以编写助手:

'label1': function(){
    var myStage = Session.get('stage');
    if (myStage == 1){return '<label-title-for-stage-1>';
    } else if (myStage == 2){return '<label-title-for-stage-2>';}
    } else if .... etc.
}

会话变量&#39; stage&#39;的任何更改将强制帮助者重新加载,使其成为您完成阶段时更新表单标题的理想选择。

然后您可以为按钮点击事件编写一个事件:

'submit #form-submit': function(){
    var options = {
        stage: Session.get('stage'),
        values: [
        { value: $('#field1').val(), name:$("#label1").text() },
        { value: $('#field2').val(), name:$("#label1").text() },
        { value: $('#field3').val(), name:$("#label3").text() }]
    }
    Meteor.call('storeValues', options, function(error, result) {
        if (error) {
            console.log(error);
        }
        Session.set('stage',result);
    });
}

这将基本上将填充的字段组合成一个对象并调用服务器方法,等待来自服务器的回调,该回调告诉客户端要移动到哪个阶段。

现在,在服务器端,您可以在集合中插入此特定用户的值,并查看特定阶段是否已填满并返回客户端是否可以继续进入下一阶段。

Meteor.methods({
    'storeValues': function(options){
        for (var i = 0; i < options.values.length; i++){
            myCol.insert({
                value:options.values[i].value,
                name:options.values[i].name,
                stage: options.stage
            });
        }
        if (options.values.length > 'amount-per-stage'){
            return options.stage + 1;
        } else {
            return options.stage;
        }
    }
});

通过这种方式,您可以存储在每个表单中输入的数据,如果已输入所有字段,则每次向上移动一个阶段。