$。当显然被忽略了

时间:2015-03-04 16:56:03

标签: javascript backbone.js marionette jquery-deferred

我有一个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

2 个答案:

答案 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;
}