2013-08-25 2 views
2

У меня действительно есть вопрос из двух частей.«this.collection.each не является функцией». Разве это не просто сказать «каждый»?

Консоль говорит мне: «TypeError: this.collection.each не является функцией»

В краткосрочной перспективе я хотел бы знать, почему мой код не работает.

В долгосрочной перспективе мне больше интересно узнать, почему он не говорит мне, что «каждый» не является функцией, поскольку это метод, который я пытаюсь вызвать.

P.S. Я подтвердил, что JQuery загружается правильно, и до того, как этот код загрузится, так что это не проблема.

Соответствующий браузер:

$(function(){ 

var items = [ 
     { name: 'Abe Lincoln', details: 'Is he that guy from that new reality show?'}, 
     { name: 'Captain Planet', details: 'He is our hero'}, 
     { name: 'Karthus', details: 'Press R'}, 
     { name: 'Your Mom', details: 'She misses me'}, 
     { name: 'Teddy Roosevelt', details: 'Makes the most interesting man in the world look boring'} 
    ]; 

    var itemsCollectionView = new ListView({collection: items}); 
    Backbone.history.start(); 
}); 

var ListView = Backbone.View.extend({ 

    el: '#the-list', 

    initialize: function(){ 
     this.render(); 
    }, 

    render: function(){ 
      this.collection.each(function(model){ 
      this.addOne(model); 
     }, this); 
    }, 

    //create an itemview for a model, and add it to the list view 
    addOne:function(model){ 
     var itemView = new ItemView({model: model}); 
     this.$el.append(itemView.render().el); 
    } 
}); 
+0

Это то, что полезно, говоря вам весь « дорожка". В чем проблема? (Также попробуйте 'forEach'.) – Ryan

+0

Спасибо, forEach работает. Мне нужно сделать несколько исследований, чтобы узнать, почему это сработало, но не каждый. Возможно, версия JQuery, которую я использую? Кроме того, спасибо, что наполнили меня тем, почему консоль работает именно так. Не был уверен, что это было из-за того, что я сделал что-то не так, чтобы браузер интерпретировал всю вещь как метод или просто помог мне найти мою проблему. – user1937279

ответ

5

this.collection.each прекрасно использовать с Backbone, проблема заключается в том, что вы не пропускание фактического сбора Backbone к экземпляру ItemView, а просто массив. Вам нужно будет что-то вроде следующего:

var itemsCollection = new ItemsCollection(items), // substitute your collection variable 
    itemsCollectionView = new ListView({ collection: itemsCollection }); 

Кроме того, я попытался запустить свой код на Backbone 1.0.0 и JQuery 1.10.1 и я получаю

TypeError: Object [object Array] has no method 'each' 
+1

По какой бы причине переключение на forEach не удалось исправить конкретную ошибку. Это позволило мне обнаружить проблему, которую вы предусмотрели. Спасибо за превентивную помощь. Это было очень полезно для решения моей следующей проблемы. – user1937279

+0

Если вы нашли мой ответ подходящим, можете ли вы принять ответ? Благодаря! –

+1

@ user1937279: Массивы имеют метод ['forEach'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach). –

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