【问题标题】:$.when apparently ignored$.when 显然被忽略了
【发布时间】:2015-03-04 16:56:02
【问题描述】:

我有一个复合视图,它表示一个任务列表,其标题包含此类列表中任务的计数器。

我已经为计数器定义了一个 ui 哈希来处理它并正确初始化它:

观点:

 ui: {
        counter: "#counter",
 },

 onRender: function(){
        this.ui.counter.text(this.collection.length);
 }

我遇到的问题是,在呈现集合时,collection.length 有时为 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

【问题讨论】:

  • App.request() 真的返回 Deferred 吗?
  • 我的钱用于请求返回除延迟以外的其他内容,大多数情况下是因为请求不存在(这里的拼写方式不存在或 js 文件所在的请求驻留尚未加载,因此尚未设置),因此它只是未定义,因此直接进入运行
  • 是的,你们是对的,我以错误的方式回报承诺

标签: javascript backbone.js marionette jquery-deferred


【解决方案1】:

您需要定义您的任务实体,否则不会请求此文件,因此不会设置处理程序

define([
    'app',
    'apps/kanban/show/show_view',
    'entities/task'
], function(App, View){

当你请求一个不存在的处理程序时,木偶不会告诉你。

【讨论】:

  • 我需要 Show.Controller 中的“实体/任务”。不过我也试过了,但没什么区别,现在解决了,谢谢!
  • 啊,好吧,错过了,对此问题有狭隘的看法
【解决方案2】:

正如@hindmost 在 cmets 中建议的那样,我三重检查了 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多