私はBackboneアプリケーションを少しずつ開発しており、Require.jsでBackboneを使用する方法を学び始めています。Backbone/Require Applicationでの共有オブジェクトのベストプラクティス
私がリファクタリングしている私のバックボーンアプリでは、App.model.repo
のような名前空間を定義しました。このモデルは、さまざまなビューで繰り返し使用されます。私はいくつかのコレクションで同じことをします。たとえば、App.collection.files
です。これらのモデルとコレクションは、最初のインデックスファイル要求でブートストラップされます。
私はthis exampleを見つけました。これは、そのブートストラップされたデータを取得するのに適しています。しかし、これらのモデルとコレクションをビュー間で再利用/共有するには苦労しています。
3つの解決策が考えられます。どちらがベストですか、なぜですか?あるいは、私が完全に欠けている別の解決策がありますか?
溶液1
インデックスでこれらの共通のモジュールおよびコレクションを(それらが中にブートストラップされた場合)を定義し、次いで(initialize
の)オプションとして、各バックボーンビューに沿って渡します。
これは分離まではきれいだと思われますが、すばやくファンキーになり、たくさんのものがその場所を通過します。
ソリューション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){
}
});
}
);
これは私が心配すると、実際にコンストラクタとインスタンスが混乱することがあります。
エンド
あなたがここまで読めば、あなたは素晴らしいです!時間をとっていただきありがとうございます。
私は既存のアプリをリファクタリングして、オプション1と3の両方を試しました。オプション1はすぐに髪の毛ができました。どこでもオプションが渡されました。多くの場合、必要な子モジュールに到達するために、すべてが必要でないモジュールが1つありました。結局、オプション3は私にとってもっときれいだと感じます。 真実、私は現在のプロジェクトでこれら3つのオプションすべてを使用しています。短いライフサイクル要素のオプション1。オプション2は、 "apiUrl"(共通ルートURL)のような単純なものです。プロジェクト規模で使用されるバックボーンモデルとコレクションのオプション3。 – Bart
接線関係:http://stackoverflow.com/a/15528785/158651 – Bart