我有一个Compositeview,它代表一个任务列表,其中包含一个包含此列表中任务的计数器的标题。
我已经为计数器定义了一个ui哈希来处理它并正确地初始化它:
观点:
ui: {
counter: "#counter",
},
onRender: function(){
this.ui.counter.text(this.collection.length);
}
我遇到的问题是,在渲染集合时,collection.length为SOMETIMES 0。尽管渲染了任务模型。有时,我的意思是有时collection.length将具有适当的值,有时不会。这看起来像竞争条件。但是,我确保在创建视图之前提取集合,显然,在显示它们之前。
我的控制器的简化示例如下:
showTasks: function(){
//layout
var kanbanLayout = new View.Layout();
//tasks
var backlogFetch = App.request("backlog:task:entities");
$.when(backlogFetch).done(function(backlogTasks){
var backlog = new View.Column({
collection: backlogTasks,
});
kanbanLayout.on("show", function(){
kanbanLayout.backlog.show(backlog);
});
App.once("fetched:kanban", function(){
App.mainLayout.mainRegion.show(kanbanLayout);
});
}
}
如您所见,我正在等待获取数据,但显然代码是在获取数据之前执行的。关于我做错什么的任何想法?
我的完整代码:
正如您所看到的,它强烈关注David Sulc的结构:https://github.com/davidsulc/structuring-backbone-with-requirejs-and-marionette/blob/master/assets/js/apps/contacts/show/show_controller.js#L13
答案 0 :(得分:0)
您需要定义任务实体,否则不会请求此文件,因此未设置处理程序
define([
'app',
'apps/kanban/show/show_view',
'entities/task'
], function(App, View){
当你请求一个不存在的处理程序时,牵牛花不会告诉你。
答案 1 :(得分:0)
正如@hindmost在评论中所建议的那样,我三重检查了承诺是否正确返回但是没有,正常运行的代码如下所示:
var API = {
getTasks: function(state, kanban_id){
Entities.tasks = new Entities.TaskCollection([], {'state' : state, 'kanban_id': kanban_id});
var defer = $.Deferred();
Entities.tasks.fetch({
beforeSend: function(xhr) {
xhr.setRequestHeader('Authorization','token '+App.loggedInUser.token);
},
success: function(data){
defer.resolve(data);
}
});
var promise = defer.promise();
return promise;
}