Here's the dynamic component:
Ractive.components.dynamic = Ractive.extend({ template: '<component/>', components: { component: function() { return this.get('name'); } }, oninit: function(){ this.observe('name', function(){ this.reset(); }, { init: false}); } });
Just enter the name of the component that it should implement:
<dynamic name='{{name}}'/>
See in action below
Ractive.components.a = Ractive.extend({ template: 'I am A {{foo}}' }); Ractive.components.b = Ractive.extend({ template: 'I am B {{foo}}' }); Ractive.components.c = Ractive.extend({ template: 'I am C {{foo}}' }); Ractive.components.dynamic = Ractive.extend({ template: '<component/>', components: { component: function() { return this.get('name'); } }, oninit: function(){ this.observe('name', function(){ this.reset(); }, { init: false}); } }); var r = new Ractive({ el: document.body, template: '#template', data: { foo: 'foo', list: ['a', 'b', 'c'], name: 'a' } });
<script src="http://cdn.ractivejs.org/latest/ractive.js"></script> <script id='template' type='text/ractive'> {{#each list}} <input type='radio' name='{{name}}' value='{{.}}'>{{.}} {{/each}} <br> <dynamic name='{{name}}'/> </script>
source share