私は Backbone アプリケーションを開発してしばらく経ちましたが、Require.js で Backbone を使用する方法を学び始めたところです。
リファクタリング中のバックボーン アプリでは、次のような名前空間を定義しましたApp.model.repo
。このモデルは、さまざまなビューで何度も使用されています。たとえば、いくつかのコレクションで同じことを行いApp.collection.files
ます。これらのモデルとコレクションは、最初のインデックス ファイル リクエストでブートストラップされます。
this exampleを見つけました。これは、ブートストラップされたデータを取得するための優れた方法のように見えます。ただし、これらのモデルとコレクションをビュー間で再利用/共有するための最良の方法に苦労しています。
考えられる解決策は 3 つ考えられます。どちらが最適で、その理由は? または、私が完全に見逃している別の解決策はありますか?
解決策 1
これらの共通モジュールとコレクションをインデックスで定義し (それらがブートストラップされる場合)、それらをオプションとして各バックボーン ビューに渡します (のinitialize
)。
define(['jquery', 'underscore', 'backbone', 'handlebars', 'text!templates/NavBar.html'],
function($, _, Backbone, Handlebars, template){
return Backbone.View.extend({
template: Handlebars.compile(template),
initialize: function(options){
this.repoModel = options.repoModel; // common model passed in
}
});
}
);
これらは分離に関してはきれいに見えますが、たくさんのものがあちこちに渡されて、ファンキーな速さになる可能性があります.
解決策 2
モジュールを定義し、globals
よく使用されるモデルとコレクションをそれに追加します。
// models/Repo.js
define(['backbone'],
function(Backbone){
return Backbone.Model.extend({
idAttribute: 'repo_id'
});
}
);
// globals.js (within index.php, for bootstrapping data)
define(['underscore', 'models/Repo'],
function(_, RepoModel){
var globals = {};
globals.repoModel = new Repo(<?php echo json_encode($repo); ?>);
return globals
}
);
define(['jquery', 'underscore', 'backbone', 'handlebars', 'text!templates/NavBar.html', 'globals'],
function($, _, Backbone, Handlebars, template, globals){
var repoModel = globals.repoModel; // repoModel from globals
return Backbone.View.extend({
template: Handlebars.compile(template),
initialize: function(options){
}
});
}
);
この解決策は、AMD のすべてのポイントを無効にしますか?
解決策 3
一部のモデルとコレクションがコンストラクターではなくインスタンスを返すようにします (効果的にそれらをシングルトンにします)。
// models/repo.js
define(['backbone'],
function(Backbone){
// return instance
return new Backbone.Model.extend({
idAttribute: 'repo_id'
});
}
);
// Included in index.php for bootstrapping data
require(['jquery', 'backbone', 'models/repo', 'routers/Application'],
function($, Backbone, repoModel, ApplicationRouter){
repoModel.set(<?php echo json_encode($repo); ?>);
new ApplicationRouter({el: $('.site-container')});
Backbone.history.start();
}
);
define(['jquery', 'underscore', 'backbone', 'handlebars', 'text!templates/NavBar.html', 'models/repo'],
function($, _, Backbone, Handlebars, template, repoModel){
// repoModel has values set by index.php
return Backbone.View.extend({
template: Handlebars.compile(template),
initialize: function(options){
}
});
}
);
これにより、何がコンストラクターで何がインスタンスなのか、本当に混乱するのではないかと心配しています。
終わり
ここまで読んだあなたはスゴイ!お時間を割いていただきありがとうございます。