URLのナビゲート/ルーティングで問題が発生しています。たとえば、私は現在#contact/new
、同じURLを要求していて、それぞれの関数を呼び出していないとします。たとえば、URLをに変更する必要があります。#contact/edit
クリックする#contact/new
と機能します。同じURLからURLをルーティングするのは今問題ですか?
4 に答える
事前にルートへのサイレント ナビゲートを呼び出すことで、この問題を解決しました。
var url = window.location.pathname.substr(Backbone.history.root.length);
this.navigate('/', { trigger: false });
this.navigate(url, { trigger: true });
これにより追加の履歴エントリが作成されることに注意してください。ただし、私の場合、これは重要ではありません。
fragment
オブジェクトのプロパティを変更することにより、履歴エントリなしでこれを機能させることもできBackbone.history
ますが、このプロパティはプライベートであるはずなので、いじる前によく考えます:)
フラグメント プロパティは、現在の URL をナビゲート関数に渡される URL と照合するために使用されるものです。したがって、それらが一致しない場合、ルートが実行されます。
同じ問題があります。同じ URL example.com/#/new (同じ URL を 2 回呼び出す) をルーティングしても、ルートはトリガーされません。各ルーティングの後に URL を変更して回避策を作成しました。
var url = window.location.href;
url = url.substring(0,url.indexOf('#')) + '#/';
window.location.replace(url);
または簡単:
window.location.hash = '#/';
しかし、この解決策は私には少し汚いようです。
私もこの問題を理解しようとしてきました。私の最近の試みは、リンクにタイムスタンプ フィールドを追加してから、ナビゲート関数を呼び出す関数を追加することでした。
var AppRouter = Backbone.Router.extend({...});
var app_router = new AppRouter;
function LoadLink(Link) {
var Timestamp = new Date().getTime();
app_router.navigate("#/" + Link + "/ts_" + Timestamp);
}
この方法では、複数回クリックできるリンクを作成できますが、ルートを設定するときにタイムスタンプを考慮する必要があります。それは後で私を噛むために戻ってくるかもしれません。:(
パーティーに遅れていることはわかっていますが、ナビゲート機能を使用して同様の問題を解決しました。
次のようなものを試してください:
this.navigate("#contact/edit", {trigger: false, replace: true});
これにより、実際にアクションを呼び出すことなく、ルーターが認識している URL が #contact/edit に変更されます。