2014-02-09 2 views
3

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

Этот вопрос:

  1. Listento не перенаправлять метода визуализации() после сбора забирается, и это дает мне ошибку на консоли

TypeError: e is undefined

Какая ошибка я сделал с кодом ниже?

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

ответ

1

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

+0

Я убежден в вашем анализе проблемы, но как вы предлагаете делать это в такой ситуации, я использовал это решение для уменьшения количества файлов, загружаемых с сервера только по запросу. – ahmedsaber111

4

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

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

Спасибо большое за, я думал, что это может быть проблемой масштабы и сделал много решений, включая тот, который вы только что упоминали, но кажется, что это не проблема, подумайте, что ответ Риды ближе, чтобы решить его, не так ли? – ahmedsaber111

Смежные вопросы