Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 主干路由器不会触发直接URL-使用Meteor_Backbone.js_Meteor - Fatal编程技术网

Backbone.js 主干路由器不会触发直接URL-使用Meteor

Backbone.js 主干路由器不会触发直接URL-使用Meteor,backbone.js,meteor,Backbone.js,Meteor,我使用的是ToDo示例中相同的基本路由器代码,但遇到了一些问题。当我使用Router.navigateToItem(itemID)时,一切都正常。但是,如果我输入一个直接url(/inventory/itemId),那么会话变量永远不会设置,因此直接url不起作用。我可以想出如何让路由器通过直接URL触发。非常感谢你的帮助。以下是我正在使用的代码: var WebRouter = Backbone.Router.extend({ routes: { "": "main",

我使用的是ToDo示例中相同的基本路由器代码,但遇到了一些问题。当我使用Router.navigateToItem(itemID)时,一切都正常。但是,如果我输入一个直接url(/inventory/itemId),那么会话变量永远不会设置,因此直接url不起作用。我可以想出如何让路由器通过直接URL触发。非常感谢你的帮助。以下是我正在使用的代码:

var WebRouter = Backbone.Router.extend({
    routes: {
      "": "main",
      "inventory/:itemId": "itemDetail"
    },
    main: function () {
      Session.set("inventoryItem", null);
    },
    itemDetail: function(itemId) {
      Session.set("inventoryItem", Items.find({_id:itemId}).fetch()[0]);
    },
    navigateToItem: function(itemId) {
      this.navigate("inventory/"+itemId, {trigger: true});
    }
  });

  Router = new WebRouter;

  Meteor.startup(function () {
    Backbone.history.start({pushState: true});
  });
编辑1:

我注意到,如果我没有说明:

Backbone.history.start();
然后一切似乎都正常了。然而,我的url中有一个愚蠢的哈希符号,我不知道它来自哪里:/#inventory/WsL7YZxiWk3Cv3CgT

越来越近。。。我也不确定没有pushState会失去什么

编辑2:

另一次失败的尝试:

  window.onload= function(){
    var url = window.location.pathname;
    Router.navigate(url.substring(1,url.length), {trigger: true});
    console.log(url.substring(1,url.length));
  };

我真的认为这一个会起作用,但它不…

您需要配置服务器重定向所有URL,以提供请求根目录时提供的内容。主干网只在页面加载后处理URL,如果您没有将服务器配置为处理URL,那么主干网将永远不会被加载,因为HTML永远不会被发送。

我知道了。这是一个更微妙的问题,很难解释,我不完全确定我是否完全理解:

我会将会话变量设置为数据库中的对象,而不是将会话变量设置为数据库对象id,并将该数据库对象与模板进行反应性链接

不管怎样,我更改了这些行:

  Template.inventory.inventoryItem = function () {
    return Session.get("inventoryItem");
  }  

  Session.set("inventoryItem", Items.find({_id:Session.get("inventoryItem")}).fetch()[0];);
改为:

  Template.inventory.inventoryItem = function () {
    return Items.find({_id:Session.get("inventoryItem")}).fetch()[0];
  } 

  Session.set("inventoryItem", itemId);

现在一切都神奇地工作了……

这并不能解决您当前的问题,但您是否尝试过这种方法?它非常易于使用(IMO),并且可以使用到IE8.im,这对web开发来说是一个新概念。这对我来说并不容易——我不知道page.js是什么,然后我开始浏览它,发现越来越多我不理解的东西…:/是的,你需要meteorite来使用它,但一旦你安装了meteorite,你只需编写
mrt添加路由器
即可将路由器添加到你的项目中。它会在这个过程中添加page.js(你其实不需要知道关于page.js的任何信息,这取决于它)