2013-08-31 6 views
7

私は最近knockout.jsとsammy.jsを使って自分のアプリケーションを近代化し始めました。しかし、私はいくつかの問題に立ち往生しました。sammy.jsから '実際のリンク'を盗まれない

私はページ上に有効なリンクをいくつか持っています。実際には、sammy.jsを使用してナビゲーション動作を模倣するのではなく、その場所に実際に移動する必要があります。私はハッシュベースのリンクだけをsammy.jsでルーティングしたいだけですが、ハッシュを含まないリンクも傍受します。

たとえば、それは<a href="/logout">logout</a>を傍受します。

ルーティングを行いJS部分がある:

Sammy(function() { 
    this.get('#/', function() { 
     ... 
    }); 

    this.get('#:id', function() { 
     ... 
    }); 

    this.get('', function() { this.app.runRoute('get', '#/') }); 
}).run(); 

私はthis.get('' ..)一部は、この動作を起動する犯人だと思う - 私はラインは、ユーザーを許可する必要があると述べているknockout.jsのチュートリアルからそれを得ました他の起源から私のウェブページを適切にブラウズすること。 knockout.jsコードで実行されるページは/w/です。私はsammy.jsが/w/でしか動作しないようにするか、少なくともユーザが/logoutにナビゲートできるようにします。どうすればこれを達成できますか?

+0

これを解決しましたか?そうでない場合は、[jsfiddle](http://jsfiddle.net/)でこれを再現することをお勧めします。 – edhedges

+0

@ edhedgesこれは、あなたのWebアプリケーションのエントリポイントを定義することだと思います。私のアプリはPythonのWebサーバーから生成されたHTMLを持つ従来の複数ページのアプリケーションです(sammy.jsとhash + ajaxをある程度活用しています)。ですから、私の解決策は 'this.get( ''、...)'を取り除き、 'location.href = <このページに必要な、サーバーから生成されたハッシュ>'を置くことでした。今では非ハッシュURLは傍受されません。 – thkang

+0

解決したら他人のために自分で質問に答えるべきです。 – edhedges

答えて

1

「周囲」機能を使用できます。オプションがたくさんあります。私は次のようにすることを提案します:

いくつかのURLがあると仮定しましょう。そのURLに当たると、サーバーとそのページを通信したいと思う。たとえば、 "/ logout"のようなlogout urlです。

"/logout?reload=true" 

を次のようにサミーのコード私はサミーを使用し、私はあなたがこれをオフにすることができると思いますので、しばらくして

Sammy(function(){ 

    this.around(function(callback) { 
     if(this.params.reload === 'true')  
      location.replace(this.path); 
     else 
      callback(); 
    }); 
    // Your routers are going to be here 

}).run() 
+0

コールバックを忘れたため、再ロードがなければ何も起こりません。私はあなたの答えを編集するためにとても自由でした。今は広告されたように動作します!ありがとう! – user562529

10

に従うことによって制御することができ、そのので、今そのURLを作りますdisable_push_state設定での動作:

Sammy(function() { 
    this.disable_push_state = true; 
    ... 
}); 
0

私がwindow.locスタートアップ時に保存されたウィンドウの場所のコピーに私はサミートラップから安全に脱出することができます。ベースURLが一致する場合は、ベースルートを実行します。一致しない場合は、window.locationをリロードしてSammy.jsをアンロードします。

function myUrl() { 
    var url= window.location.href; 
    if (window.location.hash) { 
     url= url.replace(window.location.hash, ""); 
    } 
    if (window.location.search) { 
     url= url.replace(window.location.search, ""); 
    } 
    return url; 
} 

... 

Sammy(function() { 

    var myLocation = myUrl(); 

    ... 

    this.get('', function() { 
     if (myLocation === myUrl()) { 
      this.app.runRoute('get', '#/'); 
     } else { 
      window.location.reload(true); 
      this.unload(); 
     } 
    }); 
}).run(); 
関連する問題