2015-11-02 15 views
16

コンテキスト、角度、ui-router、何も特別なものはありません.3つの名前付きui-viewで構築されたルートビュー。 のでindex.htmlに、我々は

<body> 
    <div ui-view='left'> 
    <div ui-view='center'> 
    <div ui-view='right'> 
</body> 

を持って、私のルートは

$stateProvider 
.state('main', { 
    url: '/', 
    views: { 
    'left': {templateUrl: 'foo.html'}, 
    'center': {templateUrl: 'bar.html'}, 
    'right': {templateUrl: 'xyz.html'} 
    } 
}) 
.state('main.b', { 
    url: '/b', 
    params: { foo: {value: 'bar'} } 
    views: { '[email protected]': {templateUrl: '123.html'} } // I wish to update $stateParams in '[email protected]' view 
}) 
.state('main.c', { 
    url: '/c', 
    params: ... 
    views: { '[email protected]': ..., '[email protected]': ..., '[email protected]': .. } 
}); 

のように見える「中央」と「左」ビューで$ stateParamsを更新するために、状態をbに行くにおける方法はあります?私はそれをサービスを使用して得ることができますが、私は必要な変数に$watchを追加する必要があり、それは私に少しハッキーに見えます。

私は実際に私が欲しいものを得ることができますが、ビューがリロードされ、私は左のビューでキャンバスを持っているので、この動作を避けたいと思います。

答えて

23

あなたは意見をリロードせずに特定のルートに移動するには、以下を使用することができます。

$state.go('.', {parm1: 1}, {notify: false}); 

リテラル最後のオブジェクトは、あなたがgoに沿って渡すことができるオプションを表します。 notifyfalseに設定すると、実際にコントローラーが再初期化されなくなります。冒頭の.は絶対状態名または相対状態パスです。

重要なことはnotifyです。

+3

これは何とかまだのinit $にビュー内のすべてのコンポーネントを引き起こし、その後すぐに$いくつかの深刻なパフォーマンスにつながる可能性がある、破壊問題。あなたのコンポーネント内で 'this。$ onInit()'と 'this。$ onDestroy()'に 'console.log()'を追加するかどうか確認できます。 –

7

https://github.com/angular-ui/ui-router/issues/1758#issuecomment-205060258から@christopherthielenクォート:

通知使用して:偽良いアイデアなることはほとんどありませんし、現在は非推奨 です。必要な場合は、reloadOnSearchを使用してください。

1.0のバージョン(現在 1.0.0-alpha.3)で動的パラメータを試すこともできます。あなたの状態では、などの動的パラメータを設定し、uiOnParamsChangedコールバックを実装します。デモの

.state('foo', { 
    url: '/:fooId', 
    params: { fooId: { dynamic: true } }, 
    controller: function() { 
    this.uiOnParamsChanged = function(changedParams, $transition$) { 
     // do something with the changed params 
     // you can inspect $transition$ to see the what triggered the dynamic params change. 
    } 
    } 
}); 

を、このplunkerを見て:http://plnkr.co/edit/T2scUAq0ljnZhPqkIshB?p=preview

+0

私を守ってくれなかったことは、stateProvider定義で 'views'が定義されていれば、' controller'プロパティを 'views'定義で定義し、外側では定義しないということです。 例ドキュメントで:https://ui-router.github.io/docs/latest/interfaces/ng1.ng1statedeclaration.html#views 'ビュー:{ ヘッダ:{ コントローラ:関数(){ this.uiOnParamsChanged =関数(changedParams、$転移$){... }}、 templateUrl: "header.html" }、 体:{ コントローラ: "bodyCtrl"、 templateUrl: "body.html" } 、 フッター: "footerComponent" } – ako977

6

私は「ダイナミックのparams」を使用することは今だと思い

dynamicがtrueの場合、パラメータ値を変更しても状態は入力/終了されません。解決は再フェッチされず、ビューも再ロードされません。

$stateProvider.state('search', { 
    url: '/search?city&startDate&endDate', 
    templateUrl: 'some/url/template.html', 
    params: { 
     city: { 
     value: 'Boston', 
     dynamic: true 
     } 
    } 
} 

、その後:

$state.go('.', {city: 'London'}); 

https://ui-router.github.io/ng1/docs/latest/interfaces/params.paramdeclaration.html#dynamic https://github.com/angular-ui/ui-router/issues/2709

+0

更新された回答をありがとうが、質問はどのようにして$ statあなたの例(動的パラメータ)とブラウザの戻るボタンを使用して戻ってくる人からのe.go? – pootzko

関連する問題