Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

Ahh, you're putting the entire UI in binds. That's a really clever way to handle the lifecycle of the listeners!

bind is "stupid" in the way that it completely recalculates a cells value on any change of a cell it's previous calculation depended on. It doesn't "understand" the calculation in a way to only recalculate the part that was strictly needed to update its value to a change.

I mention this because if the entire UI is in a bind, then on every change the entire UI would be recreated. I worry that this could get prohibitively slow on a sufficiently complex UI? (It can also lead to problems with widgets losing focus, but that can be solved in a similar way as in Immediate Mode GUI's).



A bind only re-evaluates if changes happen within its own immediate scope, and not if the changes are within any descendant binds' scopes. Whenever you want to carve off finer-granularity updates, scope things to a separate bind. This has scaled to, for instance, a complex WYSIWYG web page editor, where the whole page/document being edited is structured using cells and rendered with recursive binds - the app needs to be very responsive to each change a user makes, whether it's typing in text or dragging a style slider, even if the focus is on the top-level DOM element. That's not to say we've seen all the use cases - we definitely want to see where things fall down as well.


Just one last question...

Say I have something like a button with an action, and the action has a cell whose value is used when the action is executed by clicking the button.

If I create the button in a bind, and the cell in the action is also made with a bind, but during the calculation to create the button the cell for the action is never actually read, then no listeners will be attached to the cell for the action, and the cell will therefore not update itself to underlying changes.

Now sometime later I click the button, but the cell for the action has an expired value, what happens?

I guess my question is, what happens when the reading of a cell value only happens outside the evaluation of binds?

One solution could be to always add a listener to new reactive cells created during a bind, another solution is simply to evaluate a cell everytime it's value is requested when it has no listeners added.


Think of cells (including binds) as just containers: when you call .get() (inside or outside a bind), you just get the currently stored value. Besides the container abstraction for its own sake, values also enable the scoping effect described earlier - if you have x.get() + y.get(), and x updates, you don't need to re-evaluate y (which in turn may be a bind - its body is scoped off so that you're not re-evaluating an entire sub-graph of the application). They're also necessary groundwork for smarter propagation strategies, e.g. stopping propagation if the value hasn't changed.


Nice! Thanks for taking the time to explain this :-)


These are great questions! The topics deserve attention from the docs, esp. regarding suggested ways of doing things (e.g. the `shown` example from earlier vs. imperatively adding/removing elements).




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: