2017-02-09 13 views
-1

私はUI-Router for Angularを使用しています。私はサイドバーとメインのビューを分離しています。今私は、サイドバーのビューで行ういくつかのアクションの後、メインビューでいくつかのクラスを変更する必要があります。AngularJSで1つのコントローラと2つのビューを通信

だから、これは私のコードです:

設定

.state('app.area', { 
    url: '/area/:areaId', 
    views: { 
     '@': { 
      template: require('./app/generic/genericWithSidebar.html'), 
      controller: 'AreaCtrl' 
     }, 
     '[email protected]': { 
      template: require('./app/area/_area.html'), 
      controller: 'AreaCtrl', 
      controllerAs: 'CTRL', 
     }, 
     '[email protected]': { 
      template: require('./app/area/_sidebar.html'), 
      controller: 'AreaCtrl', 
      controllerAs: 'CTRL', 
     } 
    }, 

コントローラ

class AreaCtrl { 
    constructor($scope) { 
     "ngInject"; 

     this.$scope = $scope; 
     this.$scope.descriptionIsActive = false; 
    } 

    showAreaDescription() { 
     this.$scope.descriptionIsActive = !this.$scope.descriptionIsActive; 
    } 
} 

export default AreaCtrl; 

とビュー、サイドバーのために、メイン

// sidebar view 
<span ng-click="CTRL.showAreaDescription()">show more</span> 
// main view 
<div ng-class="{'active': CTRL.descriptionIsActive}"></div> 

コントローラ間で通信する必要がありますが、コントローラが1つあります。

+0

各ビューは、それぞれ独自のスコープを持つ新しいAreaCtrlインスタンスを初期化することに注意する必要があります。 – charlietfl

+0

@charlietflどうすればよいですか?私はビューのコントローラ定義を削除し、親のためだけに残すべきですか? – Lukas

+0

おそらく.....はい。しかし、実際には十分にアプリについては知られていません – charlietfl

答えて

1

「正しい」解決のための

stateProvider.state("app.area",{ 
    url:'/app.area', 
    templateUrl: 'app_area_frame.html', 
    controller:'AreaCtrl', 
    controllerAs: 'CTRL', 
    views:{ 
     'main':{ 
      template: require('./app/area/_area.html') 
     }, 
     'sidebar':{ 
      template: require('./app/area/_sidebar.html') 
     } 
    } 

}) 

ネストされたビューは、ナビゲーションの変化を引き起こすあなたのメインビューに変更されたことが何であるかに依存します。

私がちょうどanswered hereのように、コントローラがお互いに「話す」必要がある場合は、一般的には悪い兆候です。これは、多くの場合、両方のビューでバインドするデータ/状態を処理するserviceを持つ必要があることを意味します。

しかし、あなたの変更は実際にはグローバルな化粧品ナビゲーションのもの(私は例を考えることはできませんが、それは不可能だと言いたくありません)、 "グローバル" NavigaitonController(例えばbody)正しいかもしれない。私はそれを疑う。

私の提案は:どのデータが変更を引き起こすかを考え、それ自身のサービスでそのデータの状態を処理し、必要なサービスプロパティにバインドします。

+0

サイドバーのアクションのために、私は1つ、他のコントローラを使用しましたか?その場合、すべてが正常に動作しています。アドバイスのためにトップからThx。 – Lukas

1

コントローラをviewsオプションの外に定義すると、状態ロード時に1回だけロードされるようにすることができます。 UI-routerdocs

+0

いいえ、私はコントローラのビューにアクセスする必要はありません:( – Lukas

+0

どういう意味ですか:) –

+0

シンプルで、アクションフォームコントローラが伝播していない、正しく表示されているメインビューで使用しています... – Lukas

0

状態はサービスによってカプセル化されるため、実際には、アプリケーション全体で共有されるべき状態がある場合は、サービスを作成する必要があります。

また、コントローラ用のコントローラがあり、サイドバーとメインページの子スコープで継承できるコントローラを使用することもできます。

0

おそらく、この回答はあなたの特定の質問の正確な答えではありません。しかし、アーキテクチャの観点から見ると、サイドバーでメインビューを処理するためにネストされたビューを使用すべきではありません。

このサイドバーは、すべての州で同じである必要があります。したがって、ネストされたビューを使用している場合は、毎回サイドバーを指定する必要があります。また、すべての州にサイドバーのコードを記述する必要があります。これは、アプリケーションを設計するための推奨方法ではありません。

Q&Aを強くお勧めします。

どのように設計するのですか?

サイドバーを単純なテンプレートとして作成し、ng-includeを使用してフッター部分をレンダリングします。

<footer ng-include="'/sidebar.html'" ng-controller="sidebarController"></footer> 

ご覧のとおり、サイドバー専用のコントローラがあり、コードを各メインコントローラに複製する必要はありません。

+1

いいえ、サイドバーはページごとに異なるので、私はそれとメインセクションのための分離した子ビューを持つ必要があります。 – Lukas

+0

@ Lukas大丈夫です。大文字と小文字の区別がある場合は、ネストされたビューを使用してください。 –

関連する問題