I feel like I'm missing something obvious, but how do I remove nodes from the render tree and destroy them correctly?
It looks like I can just do something like mainCtx._node._child.splice(2,1), but this doesn't work in all cases (Scrollviews seem to stick around), and assume there's something relevant in the API but I can't seem to find it.
You never remove renderNodes - you use smart RenderNodes to manipulate what is rendered.
The solution depends on what you want to accomplish:
The easiest way to show / hide / swap parts of the RenderTree is to use a RenderController. You can even specify in/out transitions
var renderController = new RenderController();
renderController.show( .... );
renderController.hide( .... );
See the official example
Don't worry about removing nodes. Famo.us will manage this for you.
If you want to take control of rendered nodes, write a custom View with a render function. The Flipper class is a simple example (and the RenderController is a complex example of this pattern)
In depth explanation:
RenderNode has a render function which creates a renderSpec. Modifier or Surface.
Modifier specs are used to calculate the final CSS properties.Surface specs are coupled to DOM elements.Engine, the renderSpec is rendered using the RenderNode.commit function.commit function uses the ElementAllocator (from the Context) to allocate/deallocate DOM elements. (Which actually recycles DOM nodes to conserve memory)Therefore: Just return the correct renderSpec in your custom View, and famo.us will manage memory and performance for you.
BTW, you don't need to use the View class - an object with a render function will suffice. The View class simply adds events and options which is a nice way to create encapsulated, reusable components.
ShowModifier (gist) a simple modifier to show/hide parts of the rendering tree
var mod = new ShowModifier({visible:true});
mod.visible = true;
mod.show();
mod.hide();
or, as alternative, use this gist to add visibility functions to Modifier and StateModifier
modifier.visibleFrom(function(){ return true; }) // function, getter object or value
stateModifier.setVisible(true); // or false
WARNING: Adding/removing DOM-nodes by manipulating the renderspec might cause a performance penalty!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With