【发布时间】:2014-08-05 06:44:55
【问题描述】:
我在 require Js /Backbone Js / Marionette Js 应用程序中遇到了“Backbone.history.start({ pushState: true})”的问题,所有 RequireJs 依赖项都在其正确的文件夹中。
这是我的问题:应用程序在没有“pushState:true”参数的情况下完美运行,所有需要按预期加载的模块,但是由于没有 pushState 参数“#”显示在 url 中,因此从 url 中删除 # 我使用了 Backbone.history.start ({ pushState: true})。 但是,一旦我在顶级 app.js 文件中将 {pushState: true} 作为参数添加到 Backbone.history.start(),requireJs 模块会更改其加载路径,并给出 404 (not found) 错误并且无法加载要求模块整个代码分解。那么pushState有什么问题?或者它是如何工作的?
这是我的代码 App.js
define(['jquery', 'backbone', 'marionette', 'underscore', 'handlebars','init/configuration'],
function ($, Backbone, Marionette, _, Handlebars,config) {
var MyApp = new Backbone.Marionette.Application();
MyApp.addRegions({
mainRegion:"#main"
});
MyApp.navigate = function(route, options){
options || (options = {});
Backbone.history.navigate(route, options);
};
MyApp.getCurrentRoute = function(){
return Backbone.history.fragment
};
MyApp.addInitializer(function ()
{
if(Backbone.history)
{
require(["js/app/routers/cmMessageRouter.js",], function () {
Backbone.history.start({ pushState: true});
if(MyApp.getCurrentRoute() === "")
{
MyApp.trigger("show:message",7);
}
});
};
});
return MyApp;
});
cmMessageRouter.js
define(["app"],function(app){
app.module("Message",function(message, app, Backbone, Marionette, $, _){
message.router=Backbone.Marionette.AppRouter.extend({
appRoutes : {
"messages/:id":"showMessage"
}
});
var API = {
showMessage : function(id)
{
require(["controllers/cmMessageController"], function(controller){
var controllerObj=new controller.messageController();
controllerObj.showMessage(id);
});
}
};
app.on("show:message",function(id){
app.navigate("messages/"+id,{trigger: true});
});
app.addInitializer(function(){
new message.router({
controller: API
});
});
});
return app.Message;
});
cmMessageController.js
define(["app","views/cmMessageView"],function(app,messageView){
app.module("Message.Controller",function(controller,app,Backbone,Marionette, $, _){
controller.messageController = Backbone.Marionette.Controller.extend({
//gets mapped to in AppRouter's appRoutes
showMessage:function(userid) {
require(["collections/cmMessageCollection","collections/cmContactCollection"], function(collection) {
var contacts = app.request("contact:items");
var model = contacts.get(userid);
app.currentFriend=model.toJSON();
var messageObj = new collection.messageCollection([] , {roomId : app.currentFriend.roomid});
messageObj.getMessages(app.currentFriend.roomid, function(res){
if(res=="success")
API.renderMessageList();
});
});
},
});
});
return app.Message.Controller;
});
它在控制台中出现以下错误 GET ../messages/js/app/controllers/cmMessageController.js 404(未找到)
CmMessageController的实际路径是
../js/app/controllers/cmMessageController.js
如何解决这个问题?我做错了什么??
【问题讨论】:
-
您需要将所有网络请求重定向到 index.html,如果它们在同一台服务器上,显然不包括 API。除此之外,除非您对 requirejs 进行了一些非常奇怪的设置,否则您的路径不应中断。
标签: backbone.js requirejs marionette pushstate backbone-routing