2016-04-09 11 views
8

この質問は"How can I persist sibling ui-views when changing state"plunker)に基づいています。状態-ui-routerを変更すると、兄弟ui-viewsが表示される

メインナビゲーション(mainNav)で状態を変更すると、ビュー(コンテンツ)を変更しないようにしています。

コンテンツはサブナビゲーションでのみ設定し、メインナビゲーションを変更するときは残ります。

状態が残っていても、ui-routerに表示されたままになる可能性はありますか?

angular.module('MyApp', [ 
    'ui.router' 
]) 
    .config(function($stateProvider, $urlRouterProvider) { 

    $urlRouterProvider.otherwise('/'); 

    $stateProvider 
    .state('index', { 
     url: '/', 
     views: { 
     '@': { 
     templateUrl: 'layout.html' 
     }, 
     '[email protected]': { 
     template: '<a ui-sref="Main3">Main3 - with sub</a><br />' 
       + '<a ui-sref="Main4">Main4 - with sub</a>' 
     }, 
     '[email protected]' : { 
     template: '<p>This is the sub navigation</p>' 
     }, 
     '[email protected]': { 
     template: '<p>Content shared for MAINs</p>' 
     } 
    } 
    }) 
    .state('Main3', { 
    parent: 'index', 
    url: '/Main3', 
    views: { 
     /*'mainNav': { 

     },*/ 
     'subNav': { 
     template: '<a ui-sref="Main3.Sub1">Main3.Sub1</a><br />' 
     + '<a ui-sref="Main3.Sub2">Main3.Sub2</a>' 
     } 
    } 
    }) 
    .state('Main4', { 
    parent: 'index', 
    url: '/Main4', 
    views: { 
     'subNav': { 
     template: '<a ui-sref="Main4.Sub1">Main4.Sub1</a><br />' 
     + '<a ui-sref="Main4.Sub2">Main4.Sub2</a>' 
     } 
    } 
    }) 

    .state('Main3.Sub1', { 
    url: '/Sub1', 
    views: { '[email protected]': { template: 'Content of Main3.Sub1' } } 
    }) 
    .state('Main3.Sub2', { 
    url: '/Sub2', 
    views: { '[email protected]': { template: 'Content of Main3.Sub2' } } 
    }) 
    .state('Main4.Sub1', { 
    url: '/Sub1', 
    views: { '[email protected]': { template: 'Content of Main4.Sub1' } } 
    }) 
    .state('Main4.Sub2', { 
    url: '/Sub2', 
    views: { '[email protected]': { template: 'Content of Main4.Sub2' } } 
    }) 

}); 

私はPersist state when changing to another stateを見つけましたが、問題は完全に解決されません。状態は永続的ですが、別の状態にナビゲートすると一貫したビューが残ることは考慮されていません。

答えて

1

はい、それは非常に簡単ですが、制限があります。必要なデータを親のスコープに保存します。

$state.state('parent', { 
    controller:'ParentController' 
}); 

$state.state('parent.child1', { 
    controller:'ChildController' 
}); 

$state.state('parent.child2', { 
    controller:'ChildController2' 
}); 
// in Parent controller 
$scope.context = {};// it important to create a intermediary field that will store the data, otherwise you might have a problem with scopes inheritance 

// in Child controller 
$scope.context.toto = 'titi'; 

//他の子のコントローラで $ scope.context.toto = '横糸';

注:controllerAs構文を使用するとこれが動作するかどうかはわかりません。

私は個人的に、次の/戻るボタンが付いたマルチページフォームに使用します。

+0

編集がブロックされているようです:1つのことを忘れてしまいました。制限:この方法では、いくつかのフィールドを提供して親が子孫に縛られていることを意味します。紛争。これを解決する良い方法は、各子が$ scope.contextに状態を保存することです。[子の状態名]。 – Walfrat

1

ウォルファットの答えは正しいようです。私はちょうど精巧にしようとしているし、あなたが探しているものを理解しているかもしれない。ここでは、私はあなたが求めていると思うものです:私は三つの状態の深いそれを試したことがありませんが、それは動作します:

// app.js 
... 
$stateProvider 
    .state('nav', { 
    url: '/', 
    templateUrl: 'app/templates/nav.html', 
    controller: 'NavCtrl as nav', 
    abstract: true 
    }) 
    .state('nav.subNav', { 
    url: 'subNav/', 
    templateUrl: 'app/templates/subNav.html', 
    controller: 'subNavCtrl as subNav', 
    abstract: true 
    }) 
    .state('nav.subNav.index', { 
    url: 'index', 
    templateUrl: 'app/templates/index.html', 
    controller: 'IndexCtrl as index' 
    }); 
$urlRouterProvider.otherwise('/subNav/index'); 
... 

この例では、注意してください(NAV状態でabstract: true含めることにより、デフォルトのビューを設定することができます2つの状態)。これはあなたが探している効果を与えるかもしれません。

サブナビゲーションをビューとして持つことは可能ですが、そのような深いネストされたビューをお勧めするかどうかはわかりません。これはあなたが探しているものに近いですか?

+0

抄録に移動することは不可能ですが、これにはいくつかのユーティリティがありますが、OPが求めるものとは関係のないものはありません。 – Walfrat

+0

正確に。抽象的なプロパティを設定することで、ページにナビゲーションバーのような親ビューを持たせることができます。子ビューのいずれかにアクセスすると、そこに表示されます。なぜこれが関係ないのか分かりません。私は現在作業中のプロジェクトでこのメソッドを使用しています。 – Onyooo

+0

と言っているだけで、OPが何を求めているかは関係ありません。 – Walfrat