2013-03-04 25 views
11

我希望在我的Meteor html模板中有一個表單,並提交將數據插入到我的MongoDB列表中。我的問題是:在不使用額外的情況下在流星中提交表格

  • 這可能沒有使用額外的軟件包?我可以添加一個HTML表單作爲模板嗎?
  • 提交事件是否適用於最新流星?
  • 我讀過了,我們可以使用提交按鈕的點擊事件:你能告訴我怎麼去尋找我的DOM我的輸入元素的值? (不使用jQuery?)

回答

16

jquery是包含在流星&非常簡化,你爲什麼要避免它?其相當長的時間與手動遍歷DOM JS

你可以使用JavaScript來提交表單AJAX風格:

所以你可以只使用普通的HTML表單在你的模板像往常一樣:

// HTML 
<form id="myform"> 
    <input type="text" name="firstname"/> 
    <input type="text" name="lastname"/> 
    <input type="text" name="email"/> 
    <input type="submit" id="submit"/> 
</form> 


// Client JS 
function submitme() { 
    form = {}; 

    $.each($('#myform').serializeArray(), function() { 
     form[this.name] = this.value; 
    }); 

    // Do validation on 
    // form = { 
    //  firstname: 'first name', 
    //  lastname: 'last name', 
    //  email: '[email protected]' 
    // } 

    MyCollection.insert(form, function(err) { 
     if(!err) { 
      alert("Submitted!"); 
      $('#myform')[0].reset(); 
     } else { 
      alert("Something is wrong"); 
      console.log(err); 
     } 
    }); 

} 

點擊後你可以綁定選擇按鈕來插入數據:

事件地圖結合:

Template.templatename.events({ 
    'submit' : function(event) { 
     event.preventDefault(); //prevent page refresh 
     submitme(); 
    } 
}); 

如果HATE jQuery的&不能在所有

// HTML 
<form id="myform"> 
    <input id="firstname" type="text" name="firstname"/> 
    <input id="lastname" type="text" name="lastname"/> 
    <input id="email" type="text" name="email"/> 
    <input type="submit" id="submit"/> 
</form> 

// Client JS 
function submitme() { 

    form = { 
     firstname: firstname.value, 
     lastname: lastname.value, 
     email: email.value 
    }; 

    // Do validation on 
    // form = { 
    //  firstname: 'first name', 
    //  lastname: 'last name', 
    //  email: '[email protected]' 
    // } 

    MyCollection.insert(form, function(err) { 
     if (!err) { 
      alert("Submitted!"); 

      // Empty field values 
      email.value = ""; 
      firstname.value = ""; 
      lastname.value = ""; 
     } else { 
      alert("Something is wrong"); 
      console.log(err); 
     } 
    }); 
} 
+0

以及如果我做jQuery事件和jQuery DOM遍歷,那麼我應該做jQuery,而不是流星..對吧?我的意思是,我想知道流星是否有效地穿越DOM。 – 2013-03-04 17:38:35

+1

我真的不會說流星是一個類似於JavaScript的框架,它不是用來代替JQuery而是用來把所有東西放在一起,它仍然是流星放置數據與延遲補償和jQuery遍歷DOM反應。它立即插入jQuery不會自己做。流星沒有任何DOM遍歷的東西,句柄,模板系統,也是一個外部框架 – Akshat 2013-03-04 17:53:56

+1

如果模板恰好只有一種形式,你可以只有'submit'處理程序而不是'click#submit'。此外,您可以執行'$('#myform')[0] .reset()'而不是手動重置所有表單元素。 – 2013-03-04 18:26:14

11

僅供參考使用,有做流星的形式沒有所有的全球jQuery的引用一個稍微乾淨的方式,我覺得這混亂。它通過對事件處理程序中提供的模板進行作用域使代碼更容易出錯。下面是使用對方的回答中描述的形式的例子:

模板代碼:

<template name="foo"> 
    <form id="myform"> 
     <input type="text" name="firstname"/> 
     <input type="text" name="lastname"/> 
     <input type="text" name="email"/> 
     <input type="submit" id="submit"/> 
    </form> 
</template> 

事件處理程序:

Template.foo.events({'submit form' : function(event, template) { 
    event.preventDefault(); 

    firstname = template.find("input[name=firstname]"); 
    lastname = template.find("input[name=lastname]"); 
    email = template.find("input[name=email]"); 

    // Do form validation 

    var data = { 
     firstname: firstname.value, 
     lastname: lastname.value, 
     email: email.value 
    }; 

    email.value=""; 
    firstname.value=""; 
    lastname.value=""; 

    MyCollection.insert(data, function(err) { /* handle error */ }); 

}}); 
+0

當你有一個單選按鈕時,你如何做選擇器?它會是template.find('input:radio [name =「myNameForRadio」]:checked()')? – chongman 2014-02-20 15:42:24

+0

也使用Discover Meteor書籍,它們使用$(e.target).find('[name = firstname]')。val();你能解釋一下使用A)$(e.target)vs B)模板的區別嗎? – chongman 2014-02-20 15:45:15

+0

我想通了。只有不同的選擇器。 – chongman 2014-02-20 15:56:12

7

所有的最簡單,最簡單的解決方案。

// HTML 
<template name="formTemplate"> 
    <form> 
     <input type="text" name="firstname"/> 
     <input type="text" name="lastname"/> 
     <input type="submit" id="submit"/> 
    </form> 
</template> 

// JavaScript 
Template.formTemplate.events({ 
    'submit form': function(event, template) { 
     event.preventDefault(); // prevent page reload 
     var firstname = event.target.firstname.value; 
     var lastname = event.target.lastname.value; 
    } 
}); 
+0

您也可以僅從函數返回false,而不是包含'event.preventDefault()'。從[docs](http://docs.meteor.com/#/full/eventmaps):「從處理程序返回false與在事件中調用stopImmediatePropagation和preventDefault相同。」 – Grant 2015-09-06 00:28:16

0

這不是完全回答你的問題。但這是我該怎麼做的。

  1. 流星添加aldeed:自動窗體

    你已經有
  2. 示例模式...

    Books = new Mongo.Collection("books"); 
     
    Books.attachSchema(new SimpleSchema({ 
     
        title: { 
     
        type: String, 
     
        label: "Title", 
     
        max: 200 
     
        }, 
     
        author: { 
     
        type: String, 
     
        label: "Author" 
     
        }, 
     
        copies: { 
     
        type: Number, 
     
        label: "Number of copies", 
     
        min: 0 
     
        }, 
     
        lastCheckedOut: { 
     
        type: Date, 
     
        label: "Last date this book was checked out", 
     
        optional: true 
     
        }, 
     
        summary: { 
     
        type: String, 
     
        label: "Brief summary", 
     
        optional: true, 
     
        max: 1000 
     
        } 
     
    }));

3. books.tpl。玉(從mquandalle:玉)

+quickForm collection="Books" id="insertBookForm" type="method" meteormethod="insertBook" 

4.

Meteor.methods({ 
 
    'insertBook': function (doc) { 
 
     // server side validation, insert, error etc... 
 
    } 
 
})

這樣,你得到免費的免費,引導造型客戶端驗證,自定義字段可見或樣式,如果你需要。 5分鐘的發展,這是一個非常好的回報。 我會使用強大的軟件包,其他人已經投入了時間和思想,並在其上進行快速構建。

1

想分享我的方式是真正簡單:

HTML:在非常乾淨的Object {name: "...", email: "..."}

<form id="update-profile"> 
    <div class="form-group"> 
    <input type="text" required class="form-control" name="name" placeholder="Full Name" value="{{profile.name}}"> 
    </div> 
    ... 

JS

Template.profileEditModal.events({ 
     'submit form': function (e, t) { 
     e.preventDefault(); 
     var doc = {}; 

     t.$('input').each(function() { 
      if (this.value) { 
      doc[this.name] = this.value; 
      } 
     }); 
}); 

結果如果你正在使用SimpleSchemacheck(doc, Schemas.updateProfile);在其他服務器上的v alidation。

相關問題