我正在开发一个使用 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() 函数中获取模型?
我想它可以进行另一次提取,但这似乎是多余的和错误的。或者也许应该有一些路由器和视图共享的全局对象(索引视图可以将模型放入其中),但这似乎是紧密耦合。