【发布时间】:2014-07-01 00:13:12
【问题描述】:
我有 2 个视图,一个是“timetracks”列表,另一个是创建 timetrack/s 的表单 第一个附有一个集合。 第二个,timetraks 表单,它定义了一个“create”函数,该函数引用第一个函数来在创建新的 timetrack 后重新渲染 timetraks 视图。
时间轨迹代码:
define(['backbone','collections/timetracks', 'views/timetracks/item'], function(Backbone, instanceTimeTracksCollection, TimeTrackView){
var TimeTrackGrid = Backbone.View.extend({
//......
});
return TimeTrackGrid;
});
表格代码:
define(['backbone', 'collections/timetracks'], function(Backbone, instanceTimeTracksCollection){
//...............
//next comes my issue:
create: function(){
instanceTimeTracksCollection.create(indexed_array,{
success: function(model, response) {
console.info('model created, response = ',response);
// timeTracksGrid is out of scope, timeTracksGrid would be an instance of timetracks.
timeTracksGrid.render();
},
error: function(error){
console.info('error=',error);
},
wait:true
});
}
});
...最后我有了 app.js,其中定义了两个视图的实例:
requirejs(['backbone','views/timetracks/new','views/timetracks/list'],
function(Backbone, newTimeTrackForm, timeTracksGrid) {
var grid = new timeTracksGrid();
var formView = new newTimeTrackForm();
});
创建新的时间轨迹后如何呈现时间轨迹视图?
**************************** 更新 ******** *****************************
这是我的新版本代码。现在的问题是“this.listenTo(this.collection, "add", this.render);"与“this.collection.fetch”重叠。因此,时间轨迹记录会被多次呈现。
// timetracks view
define(['backbone','collections/timetracks', 'views/timetracks/item'], function(Backbone, timeTracksCollection, TimeTrackView){
var TimeTrackGrid = Backbone.View.extend({
//....
initialize: function(){
_.bindAll(this, 'render', 'generateTimeTracks', 'appendTimeTrack');
this.listenTo(this.collection, "add", this.render);
this.render();
}
render: function(){
$(this.el).html("<table border='1'></table>");
this.collection.fetch({
success: this.generateTimeTracks
});
},
generateTimeTracks : function(){
var self = this;
_(this.collection.models).each(function(item){
self.appendTimeTrack(item);
}, this);
},
appendTimeTrack: function(item){
var timeTrackView = new TimeTrackView({
model: item
});
$('table', this.el).append(timeTrackView.render().el);
}
}
其他一些变化:
- 在 app.js 上而不是按照您的建议执行 {model:myCollection} 我正在执行 {collection: myCollection}
- 我的表单代码通过调用 this.collection.create 创建了一个新模型
再次感谢!
【问题讨论】:
-
有几个问题:1)“timetrack”是timetrack视图还是模型? 2)您是否需要捕获应该创建或呈现的事件? 3) 你有能力更新视图中的 render() 方法吗?是否可以使用自定义事件?
-
@Evgeniy, 1) “timetracks”是一个视图。 2)对不起,我不明白这个问题 3)我觉得我可以......
标签: backbone.js requirejs