我的Backbone应用程序有几个视图,其中包含带有文本输入选择字段和复选框的表单。应使用我的API中的数据填充选择字段。给定的选择字段可以以多种不同的形式重用。
填充这些下拉菜单的常用方法是什么?这是我一起操纵的解决方案...... 有更常见的方法吗?
一个可重复使用的选择字段,用于填充自己... app / views / shared / location_selection.js:
define([
'jquery',
'backbone',
'app/views/base',
'app/collections/location'
], function($, Backbone, BaseView, LocationCollection) {
'use strict';
return BaseView.extend({
initialize: function(options) {
this.options = options || {};
this.options.id = this.options.id || 'location';
this.options.showBlank = typeof this.options.showBlank != 'undefined' ? this.options.showBlank : false;
this.collection = new LocationCollection();
},
render: function() {
this.setElement('<select id="' + this.options.id + '"></select>');
var self = this;
this.collection.fetch({
success: function() {
if (self.options.showBlank) {
self.$el.append('<option></option');
}
self.collection.each(function(model) {
self.$el.append('<option value="' + model.get('id') + '">' + model.get('name') + '</option>');
});
}
});
return this;
}
});
});
另一个使用该视图的视图的片段:
render: function() {
this.$el.html(this.template(this.model.toJSON()));
var locationSelectionView = new LocationSelectionView({ showBlank: !this.model.get('id') });
this.$('.location').append(locationSelectionView.render().el);
return this;
},
表单模板:
<form role="form">
<div class="form-group">
<label for="imei">IMEI</label>
<input type="text" class="form-control" id="imei" value="{{data.imei}}" />
</div>
<div class="form-group location">
<label for="location">Location</label>
</div>
<div class="checkbox">
<label><input id="master" type="checkbox"{{#if master}} checked="checked"{{/if}} /> Master</label>
</div>
</form>
答案 0 :(得分:11)
如果项目视图和集合视图都有单独的模板,则可以这样做:
var ItemView = Backbone.View.extend({
tagName: 'option',
initialize:function(){
this.template= _.template($('#menu_item_view').html());
},
render:function(){
this.$el.html(this.template(this.model.toJSON()));
return this;
}
});
var CollectionView = Backbone.View.extend({
tagName: 'select',
initialize:function(){
this.collection = new ItemCollection();
this.collection.on('sync',this.render,this);
this.collection.fetch();
},
render:function(){
_.each(this.collection.models,function( item ){
this.$el.append(new ItemView({model:item}).render().el );
},this);
return this;
}
});
编辑:就像一个注释,在Backbone 1.0之前,当你调用fetch时,它用于触发'reset',但现在它会触发'sync',除非你写fetch({reset:true})。因此,根据您运行的Backbone的版本,请注意这一点。