Ответ 1
Поскольку на это не было ответа, я буду перебирать аргумент "почему вы должны сделать это самостоятельно".
Форма представляет собой как отображение DOM, так и проверку. Я думаю, что инструменты Meteor для обоих достаточно хороши, чтобы не требовать от них другой абстракции.
Подумайте, что дает вам метеорит: вы можете написать класс для своих объектов, который сам понимает все проверки и правила. Не в родовом, "должно быть несколько способов", но так же сложно, как они существуют (должно быть простое число?). Вы можете написать этот класс, и он может работать как на клиенте, так и на сервере. Вы всегда должны проверять как на клиенте, так и на сервере. Библиотеки проверки возникли из-за того, что клиент и сервер были (по крайней мере) двумя разными языками. Node/Метеор везде JS.
Почему бы не использовать эту замечательную функцию? Не ставьте код проверки в несколько мест. Дайте свои данные вашему объекту, позвольте ему принять или отклонить его на клиенте (и на сервере).
Например, я создаю каждый текстовый элемент с помощью комбинации моего собственного шаблона и вспомогательной функции:
Форма
{{label_text fname='name' title='Agent Name' placeholder='Formal Name' collection='agent' passthrough='autofocus=autofocus ' }}
{{label_text fname='agentInCharge' title='Agent In Charge' placeholder='Owner' collection='agent' }}
{{label_text fname='phone' title='Phone Number(s)' placeholder='Include Area Code'collection='agent' }}
{{>gps }}
Шаблон
<template name='label_text'>
<div class="row">
<label class="large-3" for="{{fname}}_{{_id}}">{{title}}</label>
<div class="large-8">
<input name="{{fname}}"
id='{{fname}}_{{_id}}'
class="{{fname}}"
value="{{value}}"
data-original="{{value}}"
placeholder="{{placeholder}}"
type="{{type}}" {{passthrough}} />
</div>
</div>
</template>
и несколько помощников:
generateField = (options) ->
options.hash.value = options.hash.value or this[options.hash.fname]
# allow for simple params as default
options.hash.title = options.hash.title or options.hash.fname
options.hash.template = options.hash.template or "label_text"
options.hash.placeholder = options.hash.placeholder or options.hash.title
options.hash.type = options.hash.type or 'text'
new Handlebars.SafeString(Template[options.hash.template](options.hash))
Handlebars.registerHelper "label_text", (options) ->
options.hash.collection = options.hash.collection or 'generic'
generateField.call this, options
Handlebars.registerHelper "label_text_area", (options) ->
options.hash.collection = options.hash.collection or 'generic'
options.hash.template = "label_text_area"
options.hash.rows = options.hash.rows or 3
options.hash.columns = options.hash.columns or 40
generateField.call this, options
Handlebars.registerHelper "switch", (options) ->
options.hash.template = "switch"
options.hash.em = options.hash.em || 7
generateField.call this, options
Затем я отправляю данные клиенту, чтобы посмотреть, что он думает.