Тут мелькнула статья, как чувак, выбирая инструментарий, ничего не мог написать. Это про меня! Под Новый год нашёл 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.mixin('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

http://localhost:3000


А зачем картинка? Так я себя ощущаю после коктейля Meteor + MVVM.

Метеор-перекличка

Проголосовало 136 человек. Воздержалось 110 человек.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Поделиться с друзьями
-->

Комментарии (6)


  1. maggg
    09.05.2016 18:03
    +1

    Пишу почти что в стол: http://34377.ru
    Судя по активности вокруг Метеора на Хабре и Стэковерфлоу, клиент скорее мёртв, чем жив. К сожалению. Потому что Метеор — действительно крутой комбайн, например, для ребят с вечерним хобби, которые не могут позволить себе тратить уйму времени на изучение всех новомодных штучек мира JS, но не против попробовать их прямо сейчас и из коробки.


    1. comerc
      09.05.2016 19:15

      Считаю звёзды на GitHub:


      React — 41760
      Meteor — 33760
      Loopback — 6570
      Rendr — 4100
      Derby — 4020
      Chaplin — 2980
      JSBlocks — 2720
      Mootools — 2300
      Mojito — 1630
      Brisket — 770
      Catberry — 540
      Taunus — 560
      Fluxible — 1550
      Slot — 90


      Прибить бесплатный хостинг — гениальное решение, конечно. Хорошая такая куча на лопате из битых ссылок. Но версия 1.3 собирается ощутимо быстрее, на горизонте Apollo. Хотя нужно перелопачивать много мусора на Fastosphere, но вкусняшки имеются. И найти практику — ну очень увлекательный квест. Мой голос в колонке "пришёл к успеху", гы-гы.


      ЗЫ Favro и RocketChat как бы намекают.


      1. maggg
        09.05.2016 20:13

        Буду только рад, если моя оценка популярности фреймворка некорректна. Добавлю ещё один парадоксальный недостаток. Метеор очень быстро развивается и с каждой версией появляются новые лучшие практики, а прежние стремительно устаревают. Просматриваю Meteor Guide, и меня в нём многое удивляет. Например, новые рекомендации по структуре приложения. Они логичные и обусловлены позитивными изменениями в движке, нет вопросов. Но если вы писали какое-нибудь приложение полгода назад, вы всё делали «не так».


        1. comerc
          09.05.2016 20:58
          +1

          В нескольких славянских языках (в частности — белорусский и украинский), есть слово "перемога".


          Мне бы хотелось побыстрее, например. Ну и вообще с тоской засматриваюсь на RoadMap.


          Кстати, не будет в Blaze2 фенечек ViewModel, а потому я бросился на амбразуру.


      1. PQR
        10.05.2016 16:25

        Про популярность или не популярность Meteor я как раз недавно написал свой взгляд на тостере: https://toster.ru/q/313761?e=3841980#answer_item_807086

        Если кратко: круто, что всё-в-одном, но это сплошной велосипед. Авторы Meteor понимают проблемы и двигаются в нужном направлении (React, npm, Apollo), но по сути, им придётся всё переделать, т.е. сейчас Meteor в каком-то промежуточном состоянии.


        1. comerc
          10.05.2016 22:04

          Прощальные слова: он не любил Blaze. :)