listenTo при сбросе коллекции не вызывается после извлечения коллекции

Ниже приведена моя функция инициализации представления, которое должно получить имя модуля при инициализации, чтобы получить правильные данные из коллекции.

Проблема в следующем:

  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);
    },

person ahmedsaber111    schedule 09.02.2014    source источник


Ответы (2)


Ваша проблема riquire.js, когда вы пишете require([/*jsFile*/], callback);, вызов callback выполняется асинхронно после загрузки jsFile. Поэтому, когда вы вызываете require([... сразу после этого, вы вызываете this.listenTo(this.collection, 'reset', this.render);, и во время выполнения этой последней строки jsFile еще не загружено, а callback еще не вызвано, поэтому 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/.

person Rida BENHAMMANE    schedule 10.02.2014
comment
Я убежден в вашем анализе проблемы, но как вы предлагаете поступить в такой ситуации, я использовал это решение, чтобы уменьшить количество файлов, загружаемых с сервера только по запросу. - person ahmedsaber111; 10.02.2014

Я считаю, что это проблема области, когда модуль require находится в закрытии. Попробуйте следующее:

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);  
},
person shaunsantacruz    schedule 09.02.2014
comment
Большое спасибо, я думал, что это может быть проблема с масштабом, и нашел много решений, включая то, что вы только что упомянули, но, похоже, это не проблема, думаю, что ответ Риды ближе к ее решению, а вы? - person ahmedsaber111; 10.02.2014