簡體   English   中英

AngularJS單頁面應用程序中多個區域的獨立路由

[英]Independent routing for multiple regions in an AngularJS single page application

我有一個單頁的AngularJS應用程序,有四個區域,每個區域都有自己的內容:

頁面布局

我需要每個區域通過服務進行通信,但是否則他們需要有自己的獨立路由以用於查看目的,即它們應該各自具有自己的視圖狀態。

我試圖用angular-ui-router做這個( plunkr ),但我無法弄清楚如何創建僅影響特定模塊或區域的angular-ui狀態,而不修改頁面上其余區域。

該頁面包含以下區域:

<body>
  <a ui-sref="initial1">Initial Region 1</a><br/>
  <a ui-sref="initial2">Initial Region 2</a>

  <div ui-view="region1" class="region1"></div>
  <div ui-view="region2" class="region2"></div>
</body>

應用程序嘗試在獨立模塊中定義每個區域:

var app = angular.module('Main', ['ui.router', 'Region1', 'Region2']);

var region1App = angular.module('Region1', []);

region1App.config(function($urlRouterProvider, $stateProvider) {
  $urlRouterProvider.otherwise("/");
  $stateProvider
    .state('initial1', {
      url: '/',
      views: {
        'region1@': {
          template: 'Initial Region 1 State, go to <a ui-sref="second1">Second State</a>'
        }
      }
    })
    .state('second1', {
      url: '/',
      views: {
        'region1@': {
          template: 'Second Region 1 State, go to <a ui-sref="initial1">Initial State</a>'
        }
      }
    });
});

var region2App = angular.module('Region2', []);

region2App.config(function($urlRouterProvider, $stateProvider) {
  $urlRouterProvider.otherwise("/");
  $stateProvider
    .state('initial2', {
      url: '/',
      views: {
        'region2@': {
          template: 'Initial Region 2 State, go to <a ui-sref="second2">Second State</a>'
        }
      }
    })
    .state('second2', {
      url: '/',
      views: {
        'region2@': {
          template: 'Second Region 2 State, go to <a ui-sref="initial2">Initial State</a>'
        }
      }
    });
});

每個模塊應該有自己的“初始”狀態和“第二”狀態,並且兩者都應該同時顯示在屏幕上,而改變一個狀態不應該影響另一個。 如果使用angular-ui-router無法做到這一點,使用Angular執行此操作的最佳方法是什么?

您可以使用UI-Router Extras - 粘滯狀態來實現您的目標。

您需要為每個區域命名一個名為<div ui-view='name'></div> 然后,將sticky: true添加到以該區域的命名視圖為目標的狀態定義中。

<div ui-view="region1"></div>
<div ui-view="region2"></div>
<div ui-view="region3"></div>
<div ui-view="region4"></div>


.state('state1', {
  sticky: true,
  views: { region1: { templateUrl: 'foo.html', controller: barCtrl } }
}
.state('state2', {
  sticky: true,
  views: { region2: { templateUrl: 'foo2.html', controller: bar2Ctrl } }
}
.state('state3', {
  sticky: true,
  views: { region3: { templateUrl: 'foo3.html', controller: bar3Ctrl } }
}
.state('state4', {
  sticky: true,
  views: { region4: { templateUrl: 'foo4.html', controller: bar4Ctrl } }
}

您可以查看演示 ,演示如何工作。 注意:演示使用選項卡並相應地顯示/隱藏ui-views。 您的用例不需要顯示/隱藏每個命名視圖。

查看演示源代碼了解更多信息。

為每個區域創建了一個單獨的角度應用程序 跨應用程序的通信是通過DOM中的app元素獲取對相關范圍的引用,並通過angular.element(document.getElementById('RegionX_App')).scope().$emit發送事件來angular.element(document.getElementById('RegionX_App')).scope().$emit如下所示

更新:我最終在UI-Router Extras中使用Sticky States,如Chris T 的答案所述,並且它工作得很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM