2013-07-18 3 views
7

バックボーンのnavigateプロパティを使用しようとしています。Firefoxでバックボーンナビゲートトリガを2回

this.navigate("week/" + companyName + "/" + employeeNo + "/" + weekEnd, { trigger: true, replace: false }); 

上記のコードは1回実行されます。

それは、このヒット:

routes: { 
    "week/:companyName/:employeeNo/:weekEnd": "getWeek" 
}, 

をしてから、この関数は二回にヒットを取得します:

getWeek: function (companyName, employeeNo, weekEnd) { 
    console.log('getWeek:', companyName, employeeNo, weekEnd); 
} 

それは一度だけIEとChromeで、Firefoxで2回記録されます。

ここに問題がありますか?私はもともとトリガーを真に設定していなかったし、Firefoxはそれを無視してURLを引き金に引っ張った。

+0

コードをステップアップして、未使用のバックボーンソースを使用してください。具体的には、 'loadUrl'が呼び出されているときと、コールバックが実行されているものを探します。 – Andrew

+0

また、Backbone.jsのナビゲーショントリガは、FirefoxとMacのChrome + Safariで異なっており、それも分かりません。 – prototype

答えて

6

私は最近、FirefoxがBackbone.navigateの後に2回のサーバコールを行うのと同様の問題を抱えていました。私の場合は、文字列をエンコードしていなかったからです。あなたの会社名にエンコードする文字がありますか?

あなたは試みることができる:私は同じ問題に遭遇すると、ここで、根本的な問題になってきたように

this.navigate("week/" + escape(companyName) + "/" + employeeNo + "/" + weekEnd, { trigger: true, replace: false }); 
+1

これまでも私はこの問題に遭遇しましたが、修正はエンコーディングと関係していました。 –

+0

同じことが分音記号で起こります:http://jsfiddle.net/adyz/qcged76e/2/あなたはそれについてどう思いますか? @AdamLockhart? –

4

がでステッピング。

前述のように、問題はURLエンコーディングに起因します。さて、この問題はFirefoxでのみ表示される理由について...

ハッシュが変更されたときにルートがどのように呼び出されるかを簡単にまとめてみましょう。 3つのキーの機能がここにあります

  • loadUrl:この機能は、あなたのルートハンドラを呼び出すするものです。
  • navigate:これは手動で経路を変更するために使用される機能です。 トリガーフラグがの場合、の場合、関数はloadUrlを呼び出します。
  • checkUrl:この機能は、(それはもちろんの利用可能なとき)ウィンドウオブジェクト上 onhashchangeイベントのコールバックとして設定されています。特定の条件では、loadUrlも実行されます。

今、興味深い部分になっています。

を実行すると、にナビゲートすると、移動したフラグメントがBackboneによってキャッシュされます。ハッシュ変更、checkUrlも呼び出されます。この関数は、キャッシュされたハッシュが現在のものと等しいかどうかをチェックし、loadUrlを実行しないようにします。を先にナビゲートすると、すでに呼び出されている可能性があるので、にナビゲートします。その比較を行うには、checkUrlは、getFragmentで現在のハッシュを取得します。getHashを使用します。ここでGETHASHのコードです:

getHash: function(window) { 
    var match = (window || this).location.href.match(/#(.*)$/); 
    return match ? match[1] : ''; 
}, 

そして、あなたはあなたの問題を得ました。 location.hrefはfirefoxではURIエンコードされていますが、chromeでは存在しません。したがって、別のハッシュ(がある場合とない場合、トリガーフラグ)をfirefoxで使用すると、エンコードされていないバージョンのハッシュがキャッシュされ、エンコードされたバージョンと比較されます。ハッシュにエンコードされる文字が含まれている場合、比較の結果は負となり、Backboneは実行しないルートハンドラを実行します。

あなたのURIはコード化されている必要があります。

+0

こんにちは@Loamhoof、私も同様の問題がありますが、今回はMacのSafariでこの時間です。ここで問題を見つけることができます:http://jsfiddle.net/adyz/qcged76e/2/ - 基本的に、私はそれが発音区別記号のためだと思います。 - コード化されているかどうか。 2番目のリンクをクリックすると、URLはルート関数によってデコードされます。ありがとう、トン –

+0

それはサファリにもあります。 –

+1

こんにちは@AdrianFlorescu。 Backboneのコードを参考にして何が間違っているのかを確認することをお勧めします。具体的には前述の 'checkUrl'関数が問題の鍵となるでしょう。この返答は以前から書かれていましたが(Backbone 1.0と思います)、Backboneのコードのこの部分はそれ以来あまり変わっていないようです:http://backbonejs.org/docs/backbone.html#section-232。あなたの問題を解決したら、あなたの発見を投稿してください。 – Loamhoof

関連する問題