代码之家  ›  专栏  ›  技术社区  ›  ahmedsaber111

获取集合后,不会调用集合重置上的listenTo

  •  3
  • ahmedsaber111  · 技术社区  · 10 年前

    下面是一个视图的初始化函数,该视图在初始化时应接收模块名称,以便从集合中获取正确的数据。

    问题是:

    1. 在获取集合后,Listento不会重定向到render()方法,而且它会在控制台上给我一个错误

    TypeError:e未定义

    我用下面的代码犯了什么错误??

        initialize: function() {          
    
         var that = this;
            if(this.options.module === 'questions'){                  
    
                require([
                    'app/collections/questions'
                ], function(QuestionsCollection){                   
                    var moduleCollection = new QuestionsCollection();
                    that.collection = moduleCollection;
                    moduleCollection.fetch({
                        reset: true, 
                        success: function(){},
                        error: function(){}
                        });                                                                        
                });                
    
            }
    
            this.listenTo(this.collection, 'reset', this.render);
            this.listenTo(Backbone, 'close:Home', this.close);
        },
    
    2 回复  |  直到 10 年前
        1
  •  4
  •   shaunsantacruz    10 年前

    我认为这是一个范围问题,其中需求模块处于关闭状态。尝试以下操作:

    initialize: function() {          
    
     var that = this;
        if(this.options.module === 'questions'){                  
    
            require([
                'app/collections/questions'
            ], function(QuestionsCollection){                   
                var moduleCollection = new QuestionsCollection();
                moduleCollection.fetch({
                    reset: true, 
                    success: function(){},
                    error: function(){}
                    });
                that.listenTo(moduleCollection, 'reset', that.render);                                                    
            });                
        }
    
        this.listenTo(Backbone, 'close:Home', this.close);  
    },
    
        2
  •  1
  •   Rida BENHAMMANE    10 年前

    你的问题是 riquire.js ,当你写 require([/*jsFile*/], callback); 呼叫 callback jsFile 已加载。所以当你打电话的时候 require([... 之后立即打电话 this.listenTo(this.collection, 'reset', this.render); 在执行最后一行时 js文件 尚未加载 回调 尚未调用,因此 this.collection 未定义。

    看看这个例子 http://jsfiddle.net/ZZuGC/1/ 并且命令 console.log('require'); & console.log('listenTo'); 打印到控制台。


    我认为解决您问题的方法如下:

    initialize: function() {          
    
     var that = this;
        if(this.options.module === 'questions'){                  
    
            require([
                'app/collections/questions'
            ], function(QuestionsCollection){                   
                var moduleCollection = new QuestionsCollection();
    
                that.collection = moduleCollection;
                // here is my suggestion
                that.listenTo(that.collection, 'reset', that.render);
    
                moduleCollection.fetch({
                    reset: true, 
                    success: function(){},
                    error: function(){}
                    });                                                                        
            });                
    
        }
        this.listenTo(Backbone, 'close:Home', this.close);
    },
    

    我已经更新了示例 http://jsfiddle.net/ZZuGC/2/