Тут мелькнула статья, как чувак, выбирая инструментарий, ничего не мог написать. Это про меня! Под Новый год нашёл ViewModel.org. А внутри прекрасный Two-Way Binding. Но не проходит ощущение ящика в гараже, заваленного гаечными ключами вперемешку с "лишними" деталями. Наглядный пример, как в собственной же демке пришлось ввернуть костыль, гы-гы. И я застрял на четыре месяца — хобби по вечерам после работы. Перебрал все пакеты, хоть как-то полезные для Blaze. Приставал к авторам с мольбами… Собрал в итоге новый велосипед с громким именем Template2.
Очень сложно сделать просто, как известно. Зацените:
- Совместимость с Blaze Template. Мы его любим.
- Минимальные изменения для миграции вашего гениального проекта.
- Декларация переменных модели нужна только один раз через атрибут
<input value-bind>
(что отдельно полезно для дебага кода пришельцев). - Валидация входных данных и получение ассоциативного массива документа для записи в Mongo — это всё вообще без кодинга.
- Поддержка SimpleSchema и возможность расширения для других моделей (только что вышла Astronomy 2.0, например).
<body>
{{> hello param="123"}}
</body>
<template name="hello">
<p>props.param {{props.param}}</p>
<p>state.value {{state.value}}</p>
<form>
<input value-bind="value"/>
<button type="submit">Submit</button>
</form>
<p>{{state.errorMessages}}</p>
</template>
// Тюнинг - наше всё!
Template2('hello', {
// Валидация параметров, переданных из родительского шаблона
propsSchema: new SimpleSchema({
param: { type: String }
}),
// Устанавил схему модели
modelSchema: Posts.simpleSchema(),
// Установил реактивные состояния шаблона
states: {},
// Хелперы и События работают как прежде, но с контекстом Template.instance()
helpers: {}, events: {},
// Колбеки живут своей жизнью без изменений, как в стандартном Blaze
onCreated() {}, onRendered() {}, onDestroyed() {},
});
// Хелперы и События можно декларировать в старом стиле, но с контекстом Template.instance()
Template.hello.eventsByInstance({
'submit form': function(e) {
e.preventDefault();
// Get doc after clean and validation for save to model
this.viewDoc(function(error, doc) {
if (error) return;
Posts.insert(doc);
});
}
});
// Колбеки старой школы можно использовать без изменений.
Template.hello.onRendered(function() {
var self = this;
this.autorun(function() {
var doc = Posts.findOne();
if (doc) {
// Set doc from model to view
self.modelDoc(doc);
}
});
});
Запустить демку? Легко:
$ git clone https://github.com/comerc/meteor-template2.git
$ cd meteor-template2
$ meteor
А зачем картинка? Так я себя ощущаю после коктейля Meteor + MVVM.
Only registered users can participate in poll. Log in, please.
Метеор-перекличка
14.01% Пришёл к успеху22
19.11% Пишу в стол30
66.88% Пока интересуюсь105
157 users voted. 120 users abstained.