2013-05-27 4 views
1

У меня есть этот вид сбораПочему моя модель не пройдет?

define([ 
    'jquery', 
    'underscore', 
    'backbone', 
    'views/project', 
    'collections/project-collection', 
    'templates' 
], function ($, _, Backbone, ProjectView, ProjectCollection, JST) { 
'use strict'; 

var ProjectListView = Backbone.View.extend({ 
    template: JST['app/scripts/templates/projectList.ejs'], 
    el: $('#content'), 

    render: function() { 
     var projectCollection = new ProjectCollection(); 
     projectCollection.fetch(); 
     projectCollection.each(this.addOne(),this); 
     return this; 
    }, 
    addOne: function(project) { 
     console.log('addOne function'); 
     var projectView = new ProjectView({model: project}); 
     this.$el.html(projectView.render().el); 
    } 
}); 

    return ProjectListView; 
}); 

Независимо от того, что я пытаюсь модель никогда не пропускается через функцию AddOne поэтому в представлении, что конкретизируется с помощью этого метода вызова

this.model.toJSON() 

приводит к тому, что старый метод «не может вызывать метод .toJSON неопределенной». Я попытался вставить коллекцию, когда это представление коллекции было создано, и это тоже не сработало. Очевидно, что он находится в массиве зависимостей, и это тоже не работает. Модель, безусловно, существует, так как я могу записывать projectCollection.model в консоль внутри функции рендеринга. Я в тупике.

ответ

0

Я вижу две проблемы с вашим render: тот, о котором вы знаете, и тот, которого вы не знаете.

Первая проблема здесь:

projectCollection.each(this.addOne(), this); 

Скобки на this.addOne() звонка addOne метод прямо там, а не передавая функцию this.addOne к each как обратный вызов. Вы хотите:

projectCollection.each(this.addOne, this); 

Вторая проблема заключается в том, что вы должны ждать коллекции fetch вернуться, прежде чем что-либо будет в коллекции. Вы можете использовать fetch's обратные вызовы:

var _this = this; 
projectCollection.fetch({ 
    success: function() { 
     projectCollection.each(_this.addOne, _this); 
    } 
}); 

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

+0

Я думал, что это что-то в этом роде. Я попытался связать .then(), чтобы получить, и это не сработало. Это полностью работает, спасибо. Я с подозрением относился к тому, что у меня не было подходящего контекста, но на самом деле я не понимаю все, что я знаю о контексте и закрытии. – pelachile

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