0

我正在使用与 ToDo 示例相同的基本路由器代码,但我遇到了一些问题。当我 Router.navigateToItem(itemID) 一切正常。但是,如果我输入直接 URL (/inventory/itemId),则永远不会设置 Session 变量,因此直接 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:

我注意到,如果我不 pushState:

Backbone.history.start();

然后一切似乎都奏效了。但是,然后我的网址中有这个愚蠢的哈希符号,我不知道它来自哪里:/#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));
  };

我真的以为这个会起作用,但它并没有......

4

2 回答 2

2

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

于 2013-08-08T00:25:18.767 回答
0

我想到了。这恰好是一个难以解释的更微妙的问题,我不完全确定我是否完全理解它:

我会将会话变量设置为数据库中的对象,而不是将会话变量设置为数据库对象 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);

现在一切都神奇地起作用了......

于 2013-08-08T00:36:20.527 回答