【问题标题】:Backbone pushState unable to load requireJs Modules主干 pushState 无法加载 requireJs 模块
【发布时间】: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


【解决方案1】:

如果你想使用pushState 功能,你应该让你的服务器为你的所有路由器响应相同的页面。 (是的,您应该将服务器配置为使用pushState)。

例如,您有路由"messages/:id":"showMessage"

在你使用pushState之前,如果你想查看路由messages/2,你会使用url/index.html#messages/2,浏览器会发送请求到GET/index.html,这样就OK了。

但是,使用pushState后,如果你想查看路由messages/2,你会使用url/messages/2,浏览器会发送请求到GET/messages/2,如果你不配置你的服务器,服务器会返回404 错误,因为您的文件夹中没有文件/messages/2!如何解决这个问题呢 ?当接收到/messages/2 请求时,您可以明确地将您的服务器配置为index.html 的响应内容。如果你使用的是 Nginx,可以参考Rewriting nginx for pushState-URL's

【讨论】:

  • 目前我使用的是localhost,配置服务器使用pushState到底是什么意思
  • backboneJs中的“#”免费Url有什么办法吗
  • 据我所知,不~HTTP服务器和浏览器都是这样工作的,我们只能照着做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多