Я прочитал docs и посмотрел на источник реактивность, но я этого не понимаю.
Может кто-нибудь объяснить, как это работает за кулисами, поскольку для меня это выглядит как волшебство:).
Я прочитал docs и посмотрел на источник реактивность, но я этого не понимаю.
Может кто-нибудь объяснить, как это работает за кулисами, поскольку для меня это выглядит как волшебство:).
Итак, это на самом деле довольно прямолинейно, на базовом уровне задействованы 2 типа функций:
Функции, которые создают реактивный контекст (реактивная функция)
Функции, которые недействительны для реактивного контекста (функция недействительности)
Функции, которые могут выполнять оба. (Я соврал там 3)
Когда вы вызываете reactive function, он создает context, который хранит метеориты по всему миру и к которому reactive function подписывается обратный вызов invalidation. Функция, которую вы передаете реактивной функции или любые функции, которые запускаются внутри нее, может быть invalidating function и может захватывать текущий context и сохранять ее локально. Эти функции могут тогда в любой момент, например, при обновлении db или просто вызове таймера, недействительны, что context. Первоначальный reactive function затем получит это событие и переоценит себя.
Здесь шаг за шагом, используя функции метеора (обратите внимание, что Tracker.autorun называлось Deps.autorun):
Tracker.autorun(function(){
alert("Hello " + Session.get("name"));
});
Session.set("name", "Greg");
contextcontextcontext в первый раз.context глобально как текущий активный contextreactive function, так и invalidating functioncontext и связывает его внутри с ключом "имя" когда эти функции возвращаются, метеорит очищает глобальную переменную активного контекста
Session.set - это еще одна функция, которая может привести к недействительности context.
context, созданные сеансом, связанным с ключом "имя" contexts, когда они недействительны, запускают свои обратные вызовы недействительности.context (что дизайн Session.get, а не то, что должен делать обратный вызов недействительности)contexts, теперь выполняют свои обратные вызовы недействительности.context. Вся реализация на самом деле довольно прямолинейна, вы можете увидеть ее здесь:
https://github.com/meteor/meteor/blob/master/packages/tracker/tracker.js
И хороший пример того, как это работает, можно найти здесь:
https://github.com/meteor/meteor/blob/master/packages/reactive-dict/reactive-dict.js
Реактивное программирование на самом деле не является метеорным или JS-специфическим
вы можете прочитать об этом здесь: http://en.wikipedia.org/wiki/Reactive_programming