我正在開發一個使用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()函數中保留模型?
我想它可以做另一個獲取,但這似乎是多餘的和錯誤的。或者也許應該是路由器和視圖共享的一些全局對象(即索引視圖可以放入模型),但這似乎是緊密耦合。
路由器可以擁有一個模型集合,只需查詢正確模型的集合即可。這是收藏的目的。 – mpm 2013-02-16 02:15:34
但是,「索引視圖」(獲取模型的工作)和路由器(將模型賦予應該顯示它的視圖)之間的集合是如何共享的? – Kyle 2013-02-16 02:20:09
集合可以是路由器的一個屬性,你可以在初始化函數中傳遞它,然後使用this.collection或其他什麼,你明白嗎?你正在談論緊耦合,但是如果你進行依賴注入,那麼耦合並不緊密。 – mpm 2013-02-16 02:22:16