JSFiddle - React, Tailwind, and code Playground
HTML
<script src="http://documentcloud.github.com/underscore/underscore.js"></script>
<script src="http://backbonejs.org/backbone.js"></script>
<script type="text/template" id="base-tempate">
<div class="primary"></div>
<div class="secondary"></div>
</script>
CSS
select { width: 150px }
JavaScript
(function(j, b, u){
var ItemModel = b.Model.extend({
itemsCollection: null,
defaults: {
label: '-',
items: [],
selected: false
},
initialize: function(){
if(this.get('items').length > 0){
this.set('label', this.get('label') + ' >');
this.itemsCollection = new ItemsCollection(this.get('items'));
}
}
});
var ItemsCollection = b.Collection.extend({
model: ItemModel,
selectedModel: null,
initialize: function(){
this.on('reset', this.setupDefaultProperties, this);
this.setupDefaultProperties();
},
setupDefaultProperties: function(){
this.selectedModel = this.at(0) || new this.model;
this.trigger('changeSelectedItem');
}
});
var ItemSelectView = b.View.extend({
tagName: 'option',
render: function(){
this.$el.html(this.model.get('label'));
return this;
}
});
var SelectView = b.View.extend({
tagName: 'select',
itemViews: [],
events: {
'change': 'changeItem'
},
initialize: function(options){
this.template = u.template(j('#base-tempate').html());
this.collection.on('reset', this.render, this);
},
changeItem: function(){
u.each(this.itemViews, function(view){
if(view.el === this.el.options[this.el.selectedIndex]){
this.collection.selectedModel = view.model;
this.collection.trigger('changeSelectedItem');
}
}, this);
},
renderOne: function(model){
var view = new ItemSelectView({ model: model });
this.itemViews.push(view);
...