$.when 显然被忽略
$.when apparently ignored
我有一个代表任务列表的复合视图,其中 header 包含此类列表中任务的计数器。
我已经为计数器定义了一个 ui 散列来处理它并正确初始化它:
观点:
ui: {
counter: "#counter",
},
onRender: function(){
this.ui.counter.text(this.collection.length);
}
我遇到的问题是 collection.length 在呈现 collection 时有时为 0。虽然呈现了任务模型。有时,我的意思是有时 collection.length 会有正确的值,有时却没有。这看起来像一个竞争条件。但是,我确保 collection 在创建视图之前就已获取,显然,在显示它们之前。
我的控制器的一个简化示例如下所示:
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);
});
}
}
如您所见,我正在等待获取数据,但显然在获取数据之前执行了代码。知道我做错了什么吗?
我的完整代码:
- 控制器:https://github.com/mezod/multikanban/blob/master/app/scripts/apps/kanban/show/show_controller.js#L40
- 查看:https://github.com/mezod/multikanban/blob/master/app/scripts/apps/kanban/show/show_view.js#L421
可以在这里看到。
如您所见,它严格遵循 David Sulc 的结构:https://github.com/davidsulc/structuring-backbone-with-requirejs-and-marionette/blob/master/assets/js/apps/contacts/show/show_controller.js#L13
您需要定义您的任务实体,否则不会请求此文件,因此不会设置处理程序
define([
'app',
'apps/kanban/show/show_view',
'entities/task'
], function(App, View){
很难发现,因为 marionette 不会在您请求不存在的处理程序时告诉您。
正如@hindmost 在评论中建议的那样,我三次检查了 promise 是否正确返回,但没有,功能代码如下所示:
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;
}
我有一个代表任务列表的复合视图,其中 header 包含此类列表中任务的计数器。
我已经为计数器定义了一个 ui 散列来处理它并正确初始化它:
观点:
ui: {
counter: "#counter",
},
onRender: function(){
this.ui.counter.text(this.collection.length);
}
我遇到的问题是 collection.length 在呈现 collection 时有时为 0。虽然呈现了任务模型。有时,我的意思是有时 collection.length 会有正确的值,有时却没有。这看起来像一个竞争条件。但是,我确保 collection 在创建视图之前就已获取,显然,在显示它们之前。
我的控制器的一个简化示例如下所示:
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);
});
}
}
如您所见,我正在等待获取数据,但显然在获取数据之前执行了代码。知道我做错了什么吗?
我的完整代码:
- 控制器:https://github.com/mezod/multikanban/blob/master/app/scripts/apps/kanban/show/show_controller.js#L40
- 查看:https://github.com/mezod/multikanban/blob/master/app/scripts/apps/kanban/show/show_view.js#L421 可以在这里看到。
如您所见,它严格遵循 David Sulc 的结构:https://github.com/davidsulc/structuring-backbone-with-requirejs-and-marionette/blob/master/assets/js/apps/contacts/show/show_controller.js#L13
您需要定义您的任务实体,否则不会请求此文件,因此不会设置处理程序
define([
'app',
'apps/kanban/show/show_view',
'entities/task'
], function(App, View){
很难发现,因为 marionette 不会在您请求不存在的处理程序时告诉您。
正如@hindmost 在评论中建议的那样,我三次检查了 promise 是否正确返回,但没有,功能代码如下所示:
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;
}