私は Backbone.js に関する知識を深めており、チュートリアルからこのコード サンプルを取得しています。( http://bardevblog.wordpress.com/2012/01/16/understanding-backbone-js-simple-example/ )
この例では今のところサーバーにアクセスしないので、サーバーからのデータの取得をシミュレートするために、movies.json というファイル名を使用しています。
私がやろうとしていること:
- json データをローカル ストレージに追加します (localStorage アダプターを使用)
- このために、localStorage アダプターによってエイリアス Backbone.sync に与えられる Backbone.ajaxSync を使用しています。これを行うために、refreshFromServer () メソッドを作成しました。
- これを行う理由は、データを 1 回だけ取得する方法を実装しようとしている (必要なときにのみ更新する) ためです。
私の問題: refreshFromServer () を呼び出すと、「 Uncaught Error: 'url' property or function must be specified 」というエラーが発生します。url コレクションを設定しているため、理由がわかりません。(url : "scripts/data/movies.json" )
サンプルコード
var Theater = {
Models : {},
Collections : {},
Views : {},
Templates : {}
}
Theater.Models.Movie = Backbone.Model.extend({})
Theater.Collections.Movies = Backbone.Collection.extend({
model : Theater.Models.Movie,
localStorage : new Backbone.LocalStorage("MovieStore"), // Unique name within your app.
url : "scripts/data/movies.json",
refreshFromServer : function() {
return Backbone.ajaxSync.apply(this, arguments);
},
initialize : function() {
console.log("Movies initialize")
}
});
Theater.Templates.movies = _.template($("#tmplt-Movies").html())
Theater.Views.Movies = Backbone.View.extend({
el : $("#mainContainer"),
template : Theater.Templates.movies,
initialize : function() {
this.collection.bind("reset", this.render, this);
},
render : function() {
console.log("render")
console.log(this.collection.length);
}
})
Theater.Router = Backbone.Router.extend({
routes : {
"" : "defaultRoute"
},
defaultRoute : function() {
console.log("defaultRoute");
Theater.movies = new Theater.Collections.Movies()
new Theater.Views.Movies({
collection : Theater.movies
});
Theater.movies.refreshFromServer();
//Theater.movies.fetch();
console.log(Theater.movies.length)
}
})
var appRouter = new Theater.Router();
Backbone.history.start();
ノート:
コレクション内のコメント localStorage プロパティの場合
Theater.Models.Movie = Backbone.Model.extend({}) Theater.Collections.Movies = Backbone.Collection.extend({ model : Theater.Models.Movie, //localStorage : new Backbone.LocalStorage("MovieStore") . ..});
次に、ルーターで通常のフェッチメソッドを呼び出します
Theater.Router = Backbone.Router.extend({ ルート : { "" : "defaultRoute" },
defaultRoute : function() { Theater.movies = new Theater.Collections.Movies() new Theater.Views.Movies({ collection : Theater.movies }); //Theater.movies.refreshFromServer(); Theater.movies.fetch(); }
}))
ビューでjsonリストを正しく表示できます
コレクションで localStorage プロパティを使用してから標準の fetch() メソッドを呼び出すと、空のリストしか表示されません (ローカル ストレージから読み取られて空なので正常だと思います)。
エラーはメソッド refreshFromServer () witch use Backbone.ajaxSync (backbone.sync のエイリアス) を使用する場合にのみ発生します。