2016-02-05 61 views
1

我是編程新手,所以如果這看起來很明顯,我很抱歉。我在這之前花了好幾個小時才問這個問題,所以我希望這是好的。流星/蒙哥 - 從模板中檢索_id以在函數中使用

我想要檢索一個mongo文檔的ID,以便我可以更新它(通過表單)。

我會告訴我到目前爲止什麼:

鐵路由器通過URL帶我到頁面:

Router.route('companyDetails', { 
name: 'companyDetails', 
template: 'companyDetails' 

});

模板顯示蒙戈文件(它的工作):

<template name = "companyDetails"> 
<h3>Update your Company Details</h3> 
<form class = "companysave"> 
    <dl> 
     {{#each company}} 
      id is: {{_id}}<br> 
      <p><input type = "text" value="{{name}}" name="companyName" size="35"></p> 
      <p><input type = "text" placeholder="{{phone}}" name="companyPhone" size="35"></p> 
      <p><input type = "text" placeholder="{{web}}" name="companyWeb" size="35"></p> 
      <p><input type = "text" placeholder="{{twitter}}" name="companyTwitter" size="35"></p> 
      <p><input type = "text" placeholder="{{facebook}}" name="companyFacebook" size="35"></p> 
     {{/each}} 
    </dl> 
    <p><input type="submit" value="Reset"> 
    <input type="submit" value="Update"></p> 
</form> 

模板幫手文檔數據發送到模板:就是試圖讓

Template.companyDetails.helpers({ 
    'company': function(){ 
     return Organisations.find();    
    } 
}) 

模板將更新信息發送到服務器上的方法的文檔ID:

Template.companyDetails.events({ 

    'submit form': function(event){ 
     event.preventDefault(); 

     var documentId = this._id; 

     var name = $('[name=companyName]').val(); 
     var web = $('[name=companyWeb]').val(); 
     var twitter = $('[name=companyTwitter]').val(); 
     var facebook = $('[name=companyFacebook]').val(); 
     Meteor.call('updateCompanyDetails', documentId, name, web, twitter, facebook); 
    } 

}); 

我也有一個服務器方法,但我目前卡在模板事件中的上述功能。

我收到的錯誤是基於:

var documentId = this._id; 

它來通過爲未定義。有趣的是,如果你看看模板本身,我正在寫一些調試信息:

id is: {{_id}}<br> 

它顯示正確的ID。所以模板有ID。它加載並顯示來自mongo文檔的數據,但我無法從模板事件中檢索它。

任何人都可以提供一些建議,我在這裏做錯了什麼?

再一次,我對這個(以及一般的編程)很陌生,所以它可能是一個手巴掌時刻。

太感謝了,羅布

回答

3

根據您的方法調用,它看起來像你只希望這個頁面上更新一個特定公司,而且只有將永遠是一個在你的.find()返回。如果不是這樣,您需要更新出版物和路線才能返回一個組織。這裏是代碼,使基於我所做的假定事情工作:

<template name = "companyDetails"> 
    <h3>Update your Company Details</h3> 
    {{#with company}} 
     <form class = "companysave"> 
      <dl> 
       id is: {{_id}}<br> 
       <p><input type = "text" value="{{name}}" name="companyName" size="35"></p> 
       <p><input type = "text" placeholder="{{phone}}" name="companyPhone" size="35"></p> 
       <p><input type = "text" placeholder="{{web}}" name="companyWeb" size="35"></p> 
       <p><input type = "text" placeholder="{{twitter}}" name="companyTwitter" size="35"></p> 
       <p><input type = "text" placeholder="{{facebook}}" name="companyFacebook" size="35"></p> 
      </dl> 
      <p><input type="submit" value="Reset"> 
      <input type="submit" value="Update"></p> 
     </form> 
    {{/with}} 
</template> 

Template.companyDetails.helpers({ 
    'company': function(){ 
     return Organisations.findOne();    
    } 
}); 

我改變了你的發現()到findOne(),以確保您只得到一個文檔回來。然後,我將#each切換到#with以確保我們只使用助手中返回的一個文檔。我也將#移到表單元素之外。這很重要,因爲它在提交事件中設置了this的數據上下文。您需要查看meteor guide以獲取有關這些概念的幫助。希望有所幫助!

+0

非常感謝Stephen。這個答案正是我所需要的,現在它變得更有意義。你可以看到我的初學者的錯誤,一旦你指出他們,我希望我不會再犯這些錯誤。我真的很感謝這樣一個徹底的答案,其背後的理由而不僅僅是一些代碼。再次,非常感謝。 – robster