0

ToDo の例と同じ基本的な Router コードを使用していますが、いくつかの問題が発生しています。Router.navigateToItem(itemID) の場合、すべてが機能します。ただし、直接 URL (/inventory/itemId) を入力すると、Session 変数が設定されないため、直接 URL は機能しません。Router を直接 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();

その後、すべてがうまくいくようです。ただし、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));
  };

これはうまくいくと本当に思っていたのですが、うまくいきませんでした...

4

2 に答える 2

2

ルートを要求するときに提供されるコンテンツを提供するために、すべての URL をリダイレクトするようにサーバーを構成する必要があります。バックボーンは、ページが読み込まれた後にのみ URL を処理します。サーバーが URL を処理するように構成されていない場合、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 に答える