我正在使用Require.js创建Backbone.js应用程序。每个视图文件对应于一个资源(例如“新闻”)。在每个视图文件中,我声明了一个主干 查看每个动作('index','new'等)。在我收到的视图文件的底部 来自路由器的必要信息,然后决定实例化哪个视图(基于从路由器传入的信息)。
这一切都运行良好,但它需要大量代码,似乎不是'backbone.js方式'。首先,我依靠网址管理状态。另一方面,我没有使用在很多backbone.js例子中弹出的_.bind。换句话说,我认为我做得不对,我的代码库闻起来......有关如何更好地构建我的应用程序的任何想法?
router.js
define([
'jquery',
'underscore',
'backbone',
'views/news'],
function($, _, Backbone, newsView){
var AppRouter = Backbone.Router.extend({
routes:{
'news':'news',
'news/:action':'news',
'news/:action/:id':'news'
},
news: function(action, id){
newsView(this, action, id).render();
}
});
var intialize = function(){
new AppRouter;
Backbone.history.start()
};
return{
initialize: initialize;
};
}
news.js('views / news')
define([
'jquery',
'underscore',
'backbone',
'collections/news',
'text!templates/news/index.html',
'text!templates/news/form.html'
], function($, _, Backbone, newsCollection, newsIndexTemplate, newsFormTemplate){
var indexNewsView = Backbone.View.extend({
el: $("#content"),
initialize: function(router){
...
},
render: function(){
...
}
});
var newNewsView = Backbone.View.extend({
el: $("#modal"),
render: function(){
...
}
});
...
/*
* SUB ROUTER ACTIONS
*/
var defaultAction = function(router){
return new newsIndexView(router);
}
var subRouter = {
undefined: function(router){return defaultAction(router);},
'index': function(router){ return defaultAction(router);},
'new': function(){
return new newNewsView()
},
'create': function(router){
unsavedModel = {
title : $(".modal-body form input[name=title]").val(),
body : $(".modal-body form textarea").val()
};
return new createNewsView(router, unsavedModel);
},
'edit': function(router, id){
return new editNewsView(router, id);
},
'update': function(router, id){
unsavedModel = {
title : $(".modal-body form input[name=title]").val(),
body : $(".modal-body form textarea").val()
};
return new updateNewsView(router, id, unsavedModel);
},
}
return function(router, action, id){
var re = /^(index)$|^(edit)$|^(update)$|^(new)$|^(create)$/
if(action != undefined && !re.test(action)){
router.navigate('/news',true);
}
return subRouter[action](router, id);
}
});
答案 0 :(得分:6)
虽然我觉得强调没有真正的“Backbone.js方式”很重要,但看起来你似乎正在复制Backbone应该为你做的工作。
我同意为应用程序的每个独立部分配备专用路由器是有意义的。但它首先看一下你在“子路由器”部分中所做的只是重新创建Backbone.Router
功能。您的AppRouter
根本不需要处理/news
个网址;您只需使用特定于新闻的路线初始化NewsRouter
,它就会处理与新闻相关的网址:
var NewsRouter = Backbone.Router.extend({
routes:{
'news': 'index',
'news/create': 'create',
'news/update/:id': 'update',
'news/edit/:id': 'edit'
},
index: function() { ... },
create: function() { ... },
// etc
});
只要在调用Backbone.history.start()
之前初始化它,它就会捕获其路由的URL请求,而您永远不必处理AppRouter
。您也不需要处理视图底部的丑陋代码 - 这基本上只是执行核心Backbone.Router
为您所做的事情。
答案 1 :(得分:2)
我正在使用require.js和骨干我认为我建议的主要区别是每个文件应该只返回一个视图,模型,路由器或集合。
所以我的主要html页面需要我的主路由器。该路由器是一个模块,需要基于每个路由的几个视图和一个自举模型。每个路由器方法都将相关的自举模型片段传递给相关视图。
只要每个文件只是一个主干(模型,集合,视图,路由器)并且只需要它使用的元素,它就会保持非常干净。这会产生很多js文件(我目前的项目大约有100个),但这就是require.js优化发挥作用的地方。
我希望有所帮助。
答案 2 :(得分:0)
为什么不像这样构建你的路线:
routes:{
'news':'news',
'news/edit/:id':'editNews',
'news/new':'newNews',
...
}