2016-03-01 22 views
0

在我的Meteor代碼中。我可以在服務器上定義一個方法「或函數」,並在客戶端上調用collectionName.findOne({id: 'someId'}).methodName;
作爲Meteor的新手,我不知道這是否可行,如果是這樣的話,語法會是什麼樣子?謝謝可以通過Collection.findOne調用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; 

編輯

大火Sahlzen評論讓我思考,並添加以下。

的原因,我想給一個蒙戈集合的嘗試是這樣的:

第一階段:用戶填寫一個表格,然後點擊一個按鈕,輸入值需要被用作方法參數,其當成功返回時,表單會被修改爲顯示不同的輸入字段以供用戶再次填滿並單擊SAME按鈕。第二階段:與第一階段相同,但是再次輸入字段不同。
階段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條件語句。

+0

是否有必要將Meteor方法名稱保存到集合中? –

+0

好的問題因此我編輯了我的問題。請參見。 –

+0

動態更改輸入元素,處理它們並跟蹤它們 - 如果我沒有錯,這些就是你的問題處理的內容? –

回答

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. 
} 

到會話變量「舞臺」的任何更改將迫使助手重裝,讓你通過你的階段,它的理想,以更新的形式冠軍。

然後,您可以編寫按鈕點擊事件這樣的事件:

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

通過這種方式,您可以存儲每個表單中輸入的數據,並且每次向上移動一個階段(如果已輸入所有字段)。

0

你可以做的是使用observeChanges:

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

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

查詢中包含您的收藏,和手柄功能自動檢查是否有任何變化正在給集合進行了觸發somethingHappened功能,如果有。

在發生的事情中,您可以放置​​通常放置在方法中的行爲。

您可以在客戶端和服務器端使用observeChanges,但在這種情況下,您只需要在服務器端。

+0

我想了解代碼的第一行,你是否提供一個文檔作爲參數'myCol.find'[文檔](http://docs.meteor.com/#/full/find)要求,否則除非提供的文檔參數被認爲是必需的選擇器humm –

+0

第一行是不正確的,所以我可以想象它很難理解。如果正確,第一行返回myCol集合的一部分,其中'信封'作爲'item'參數,或者隨着時間的推移對該部分集合進行的任何更改。 – Joos

+0

請參閱我的**編輯**,我將不得不爲每個「階段」編寫代碼片段,爲stageOne編寫一個新的查詢和句柄,另一個階段和處理stageTwo ... stageN? –

相關問題