シナリオ
backbonejs、requirejs、jqueryを使ってアプリを作っています。リモートサーバーからデータを取得しています。データが取得されたら、それをユーザーに表示したいと思います。
問題
最初にapp.js
ファイル内のデータをフェッチしてから、インスタンスを作成してこのビューにMoviesView
渡します。collection
内部MoviesView
にはinitialize
関数があり、この関数内ではEvent triggered
byをリッスンしていrouter
ます。そのイベントがリッスンされたら、renderAll
関数を呼び出す必要があります。問題はここにあります。関数はまったく呼び出されません。renderAll
私のコード
これは、サーバーからデータをフェッチする関数です
fetchBoxOfficeMovies: function () {
var movieCollection = new MoviesCollection;
movieCollection.fetch({success: this.successCallback, error: this.errorCallback}).then(function () {
//console.log(movieCollection.toJSON());
new MoviesView({ collection: movieCollection });
});
},
successCallback: function () {
console.log('successCallback');
},
これrouter
が私がイベントをトリガーしている場所です
routes: {
'': 'index'
},
index: function () {
App.Vent.trigger('init');
console.log('router');
}
そして、これがinitialize and renderAll
MoviesView内の関数です
initialize: function () {
App.Vent.on('init', this.renderAll, this);
console.log('movies view');
},
renderAll: function () {
console.log('renderAll');
},
コンソールに表示される出力
これが私のコンソールに表示されるものです
router
successCallback
movies view
ご覧のとおり、コンソールにrenderAllが表示されません。
質問
renderAllが表示されないのはなぜですか? どうすれば修正できますか?
アップデート
これが私のアプリ全体のビューです
var App = Backbone.View.extend({
el: 'body',
initialize: function () {
App.router = new MainRouter();
Backbone.history.start();
this.fetchBoxOfficeMovies();
},
fetchBoxOfficeMovies: function () {
var movieCollection = new MoviesCollection;
movieCollection.fetch({success: this.successCallback, error: this.errorCallback}).then(function () {
//console.log(movieCollection.toJSON());
new MoviesView({ collection: movieCollection });
});
},
successCallback: function () {
console.log('successCallback');
},
errorCallback: function () {
console.log('errorCallback');
}
});
MainRouter
を呼び出す前にの新しいインスタンスを作成していることがfetchBoxOfficeMovies
わかります。これは、他のすべての前にイベントをトリガーしていることを意味します。