我使用RequireJS来组织我的Backbone应用程序,我的路由器模块如下:
define([
'jquery',
'underscore',
'backbone',
'collections/todos',
'views/todosview'
], function($, _, Backbone, TodosCollection, TodosView){
var AppRouter = Backbone.Router.extend({
routes: {
"": "index",
"category/:name": "hashcategory"
},
initialize: function(options){
// Do something
},
index: function(){
// Do something
},
hashcategory: function(name){
// Do something
}
});
var start = function(){
p = $.ajax({
url: 'data/todolist.json',
dataType: 'json',
data: {},
success: function(data) {
var approuter = new AppRouter({data: data});
Backbone.history.start();
}
});
};
return {
start: start
};
});
我还有另一个app
模块,它使用Router.start()
来触发整个应用。
现在,在我的Backbone.View模块中,我想使用Router.navigate
来触发此Router
模块中的路由。
我的View模块的起始部分如下:
define([
'jquery',
'underscore',
'backbone',
'models/todo',
'views/todoview',
'text!templates/todo.html',
'router'
], function($, _, Backbone, TodoModel, TodoView, todoTemplate, Router){...
但是当我想在此模块中使用Router
时,它总是说Router is not defined
。我想要做的是在此View模块中触发某些操作时调用Router.navigate
。那么我怎么能实现这个目标呢?
答案 0 :(得分:8)
创建一个单独的模块,该模块包含在您使用的每个其他模块中 - 它只是创建一个对象,您可以使用该对象连接路由器实例,并从以后您希望的任何视图或模块中调用它。 (除了存储数据等其他东西,并轻松传递给其他模块)
将此模块包含在此处首先粘贴的路由器模块中。从路由器模块底部删除启动功能。然后在该文件的末尾返回AppRouter。
在最终启动骨干网并创建路由器的应用程序模块中,您可以将路由器初始化保存到我所指的共享对象中。
IE,
shared.js - >没有deps,但创建了YourObject = {};并返回YourObject router.js - >包含了shared.js app.js - >包含shared.js和router.js。应用程序设置路由器并保存到YourObject.router然后启动主干。您现在可以从需要此shared.js模块的任何其他模块调用YourObject.router.navigate()
答案 1 :(得分:3)
这是一个有根据的猜测;)
您可能有一个循环要求。您需要视图模块中的路由器模块,并且还需要路由器模块中的视图模块。
这有点像糟糕的设计。您的路由器模块可能需要了解您的视图/模型,以便实例化它们并渲染它们。你的观点应该是无知的,有一个路由器可以创建它们。他们应该做的就是提供触发路由器路由的链接。
答案 2 :(得分:0)
使用
怎么样?Backbone.history.navigate('' {触发:真});