> кто поддерживает?
В данном случае представляемая библиотека
> что, если нижний слой влияет на верхний? Получаются те же самые бесконечные вычисления
Нет, будет исключение, ибо это явная ошибка в консерватории)
> Написано сложно. Зачем писать сложно о сложном? Так любой сможет. А ты попробуй просто напиши.
Это и есть просто, на сколько это возможно)
> // формируем цепочку детей (зависимостей)
> atom.children.push(new Atom());
Вот именно этого ручного связывания и хотелось бы избежать.
Смотри, пусть у нас есть такое определение свойства:
$jin.atom.prop({ '$jin.task.view.item..current':
{ pull: function( ){
return this.list().task() === this.task()
}
}})
Что тут происходит:
1. функция - это формула вычисления значения
2. когда кто-либо запрашиват значение атома, этот атом добавляет себя в стек слушателей и исполнятет указанную функцию для вычисления значения
3. this.list - это тоже атомное свойство, когда мы запрашиваем ее значение привязанный к ней атом смотрит в стек и связывает себя с атомом с вершины стека, таким образом атом свойства this.current становится слушателем изменений атома свойства this.list
4. this.list() возвращает объект и у этого объекта есть атомное свойство task - аналогично происходит подписка и на него.
5. Ну и в завершении происходит подписка на this.task()
Но сама прелесть в том, что подписки тоже всегда актуальны:
$jin.atom.prop({ '$jin.task.view.item..current':
{ pull: function( ){
if( this.disabled() ) return false
return this.list().task() === this.task()
}
}})
Если в какой-то момент свойство this.disabled станет равно true, то при следующем вычислении this.current ее атом будет отписан от всех атомов кроме атому this.disabled, потому что пока свойство this.disabled не изменится не изменится и значение this.current