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