【发布时间】:2025-11-17 23:05:02
【问题描述】:
我正在开发一个使用 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() 函数中获取模型?
我猜它可以进行另一次提取,但这似乎是多余的和错误的。或者也许应该有一些路由器和视图共享的全局对象(索引视图可以将模型放入其中),但这似乎是紧密耦合。
【问题讨论】:
-
路由器可以有模型的集合,只需查询集合以找到正确的模型。这就是收藏的用途。
-
但是“索引视图”(负责获取模型的工作)和路由器(将模型提供给应该显示它的视图)之间如何共享集合?
-
集合可以是路由器的一个属性,可以在initialize函数中传入,然后用this.collection什么的,明白吗?你说的是紧耦合,但如果你做依赖注入,就没有紧耦合。
-
想象你做一些类似“new MyRouter(myCollection)”之类的事情,然后在路由器内部使用 this.myCollection。编辑:获取模型或其他东西不应该由视图决定,在某些时候你需要视图之外的某种调解器,将事件从视图广播到调解器(在这种情况下是路由器)然后路由器告诉模型和用于获取数据的集合。
-
哦,我想是的。所以我在路由器中创建集合,然后将集合传递给 indexView。然后 indexView 在 'lookup()' 方法中将模型放入集合中。然后当路由器调用 'view()' 方法时,模型将在那里,因为它是共享的。对吗?
标签: backbone.js requirejs