2013-07-20 4 views
1

У меня странная проблема с моим приложением. Когда я создаю коллекцию, она была «пустой», если я печатаю ее, но когда я консолью. В этой коллекции внутри коллекции есть два массива twho внутри моделей. Ну это мой сценарий:Backbone render setTimeOut

define([ 
    'jquery', 
    'underscore', 
    'backbone', 
    'text!templates/folder.html', 
    'models/folder', 
    'collections/folder', 
    ], function($, _, Backbone, FolderTemplate, FolderModel, FolderCollection){ 
    var FolderView = Backbone.View.extend({ 
     el:$('#folder'), 
     template:_.template(FolderTemplate), 

     initialize: function(){ 
      this.render(); 
     }, 
     render: function(){ 
      console.log(this.collection.models); 
     } 
    }); 

    return FolderView; 
}); 

назвать вид я использую его в другое приложение:

this.folders = new FolderCollection(); 
this.folders.fetch({ data: { dir: 'uploads'} }); 
this.foldersView = new FolderView({collection: this.folders}); 

С помощью этого приложения console.log(this.collection.models); пуст Но если я сделаю что-то подобное с SetTimeout это работает так console.log вернуть мне правильные массивы:

define([ 
    'jquery', 
    'underscore', 
    'backbone', 
    'text!templates/folder.html', 
    'models/folder', 
    'collections/folder', 
    ], function($, _, Backbone, FolderTemplate, FolderModel, FolderCollection){ 
    var FolderView = Backbone.View.extend({ 
     el:$('#folder'), 
     template:_.template(FolderTemplate), 

     initialize: function(){ 
      var here = this; 
      setTimeout(function(){ 
        here.render(); 
      },800); 
     }, 
     render: function(){ 
      console.log(this.collection.models); 
     } 
    }); 

    return FolderView; 
}); 

Как я могу использовать this.render() без setTim eOut, потому что я думаю, что это неверно или не логично делать что-то подобное.

Благодаря

ответ

2

Попробуйте с этим:

initialize: function(){ 
    var self = this; 
    this.collection.fetch({ 
    success: function(){ 
     self.render(); 
    } 
    }); 
} 
+0

Это работает отлично! Большое спасибо +1 –

0

Причина вы того, чтобы сделать это, потому что this.folders.fetch занимает много времени. Вместо того, чтобы устанавливать тайм-аут, вместо этого вы должны использовать events. Collection.fetch пожарит change событие на успех.

Таким образом, вместо того, чтобы рассмотреть что-то вроде:

this.collection.on("change", this.render); 
+0

не срабатывает изменений событий, я уже пробовал .. –

+0

Это определенно делает, см [Документы] (http://backbonejs.org/#Collection-fetch). Кроме того, вы можете переопределить метод 'success' в параметре' Collection.fetch' – juco

+0

Ну, я не понимаю, почему это не работает, я поставил «слушателя» внутри инициализации моего приложения, правильно ? –

3

Вы можете слушать reset событие, которое будет вызывать render метод

Заменить

initialize: function(){ 
    var here = this; 
    setTimeout(function(){ 
    here.render(); 
    },800); 
}, 

с

initialize: function(){ 
    this.listenTo(this.collection, 'reset', this.render); 
}, 
+0

Да еще один ответ правильный спасибо +1 –

+0

приветствуется :) –

+0

Я думаю, что события - это элегантный способ работы с асинхронным кодом, но вы должны убедиться, что коллекция фактически запускает событие 'reset':' this.collection.fetch ({reset: true}) 'и что обратный вызов события зарегистрирован ** до **, это действительно происходит. Это означает, что 'fetch' должен произойти, когда представление получает экземпляр, а не раньше. – mor

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