2013-01-23 8 views
8

私の質問の短いバージョンです:ルート変更をトリガーする必要なく、または現在表示されているページのすべてのコントローラを実行する必要はありません。すべてのコントローラをリセットしないでAngularJsの場所のパスを変更

詳細:

私は3つのコントローラによって支配領域を有する<ng-view>内に表示されるテンプレートを持っています。ページの一番上に私はインタラクティブマップを持っています。リージョンをクリックすると、クリックをブロードキャストし、他のコンポーネントがそのリージョンをピックアップし、このリージョンに関するデータを表示します。本当に簡単なセットアップ。

私がしたいのは、ユーザーがコンテンツに深くリンクできるようにすることです。誰かがリンクをクリックするたびに、別のブラウザにコピーして貼り付けることができるURLを変更したいと思います。他のユーザーがリンクをクリックして最初のものと同じ状態を見ることができます。

現在、私はこの1つのようなコードで場所を変更:

$scope.$on('mapRegionClick', function($scope, regionCode) { 
    var url = generateURL(regionCode); 

    $scope.currentScope.$apply(function(){ 
     $location.path(url); 
    });}); 

URLはその後、私のルーティングにピックアップされ、マップに加えてデータが正しく表示されます。これの欠点は、地図をクリックするたびにURLが変わるたびにテンプレート/ビュー全体が再生成されることです。マップを生成することはかなり重いので、データ提示コントローラに変更を加えるだけです。

可能ですか?どうやって?

私はコントローラ間で通信を行い、私の目標を達成することができましたが、深いリンクを行うことはできません。

PS:$location.search()reloadOnSearch=falseは使用しません。私のリンクはきれいでなければなりません:)

+0

あなたは 'ng-view'の外にマップを置いて、そのコントローラを共有サービスを使ってルートに接続されているコントローラにリンクしようとしましたか? – akonsu

+0

サイトの他の部分がマップがそれらの一部ではない他のテンプレートを使用するので、この特定のテンプレートの 'ng-view'の内部にマップが必要です。 – Ralphz

+0

角度は、これを行うためのきれいなアウトオブボックスの方法を提供していないことは大きな残念です。私は角度が大好きですが、これが私のプロジェクトの1つでEmberを好んだ理由です。 –

答えて

9

あなたは$routeサービスを使いたくありません。

$routeサービスは、URLへのナビゲートとURLのリフレッシュに違いがないようにコントローラをリロードするように設計されています。これは、すべてのURL変更に対して完全なリロードを行うことで行います。これは意図的です。

$routeのとng-includeのように使用しないでください。