require.jsを使用するバックボーンアプリケーションを開発しています。
ユーザーがモデルの「id」を入力し、そのモデルが存在する場合はそのビューにリダイレクトされるか、存在しない場合はエラーメッセージを表示するようにします。これは非常に単純に聞こえますが、各コンポーネントの役割を理解するのに苦労しています。
以下のアプリケーションでは、ユーザーは入力(ID'modelId')とボタン(クラス属性'lookup')のあるインデックスページにアクセスします。
次のコードはルーターです。
define(['views/index', 'views/myModelView', 'models/myModel'],
function(IndexView, MyModelView, myModel) {
var MyRouter = Backbone.Router.extend({
currentView: null,
routes: {
"index": "index",
"view/:id": "view"
},
changeView: function(view) {
if(null != this.currentView) {
this.currentView.undelegateEvents();
}
this.currentView = view;
this.currentView.render();
},
index: function() {
this.changeView(new IndexView());
},
view: function(id) {
//OBTAIN MODEL HERE?
//var model
roter.changeView(new MyModelView(model))
}
});
return new MyRouter();
});
次のコードはインデックスビューです
define(['text!templates/index.html', 'models/myModel'],
function( indexTemplate, MyModel) {
var indexView = Backbone.View.extend({
el: $('#content'),
events: {
"click .lookup": "lookup"
},
render: function() {
this.$el.html(indexTemplate);
$("#error").hide();
},
lookup: function(){
var modelId = $("#modelId").val()
var model = new MyModel({id:modelId});
model.fetch({
success: function(){
window.location.hash = 'view/'+model.id;
},
error: function(){
$("#error").text('Cannot view model');
$("#error").slideDown();
}
});
},
});
return indexView
});
私が理解できないのは、インデックスビューでモデルを検索する方が良いオプションのように思われることです(したがって、ユーザーが存在しないモデルを要求した場合にエラーメッセージを表示し、保持することもできます)ルータークリーナー)。ただし、問題は、view /:idルーターがトリガーされたときに、ルーターがモデルを参照しないようになったことです。view()関数でモデルを取得するにはどうすればよいですか?
別のフェッチを実行できると思いますが、それは冗長で間違っているようです。または、ルーターとビューの両方が共有する(インデックスビューがモデルを配置できる)グローバルオブジェクトがあるはずですが、それは密結合のようです。