Angularjsルーティングメカニズム

12399 ワード

前言
AngularJSルーティングには主にngRouteとngRouteに基づいて開発されたサードパーティルーティングモジュールui-routerが内蔵されており、内蔵されたngRouteは開発ニーズを満たす場合があり、ui-routerを使用すると多くのオリジナルngRouteの不足を解決することができます.AngularJSのルーティングは実際には純粋なフロントエンドの解決策であり,urlを要求するとルーティングに基づいてこのurlを構成し,テンプレートフラグメントを要求してng-viewに挿入することを本質とする.AngularJSのルーティングはurlを変更することによってページのローカルリフレッシュを行う傾向がある.
 
1 ngRoute
ngRouteを使用するには、次のようなモジュールファイルを追加でロードする必要があります.


モジュール にngRouteへの も する があります.
var app = angular.module('MyApp', ['ngRoute']);

ngRouteを すると、 の が まれます.

する

ngView
directive
なるルーティングテンプレートで されたビューレイヤを
$routeProvider
provider
ルーティング の
$route
service
ルーティングを するためのurl,view,controllerの
$routeParams
service
りルーティングに まれるパラメータの
 
$routeProviderは、ルーティングテーブルを するサービスを します.2つのコアメソッドがあります.1.when(path,route)path:stringタイプで、このルーティングルールが するパスを します. :パスに するパラメータが な 、pathパスが:/show/:nameのように、アドレスバーが:/show/lydiaの 、ここのnameおよび する lydiaは$routeParamsサービスに され、$routeParamsを する があります. を します.route:objectタイプ. の を します.
コンフィギュレーション

controller
コントローラ
controllerAs
コントローラに を ける
template
パスに するページテンプレートがng-viewに されます
templateUrl
テンプレートへのパス
resolve
このプロパティは、キー オブジェクトの で、ルーティングに するコントローラにサービスまたは をバインドします.そして した または するサービスリファレンスをコントローラに する.resolveがpromiseオブジェクトである 、コントローラに されるまで が するのを っています.この 、コントローラはresolveの を っています.
redirectTo
リダイレクトアドレス
reloadOnSearch
アドレス のみ するテンプレートをロードするかどうかを します.searchとparamsの ではテンプレートはロードされません.デフォルトはtrueです.$locationです.search()が するとルーティングが ロードされます.
caseInsensitiveMatch
パスの と の
2.otherwise(params)は、パスマッチングが れた に する.

ステップ1:htmlページを し、ローカルリフレッシュが な でng-viewを します.
<body ng-app="routeApp">
<div ng-view>div>


<script src="bower_components/angular/angular.js">script>
<script src="scripts/app.js">script>
<script src="scripts/controllers/main.js">script>
body>

ステップ2:controllerルーティング の
var routeApp = angular.module('routeApp',[]);
routeApp.config(['$routeProvider',function ($routeProvider) {
      $routeProvider
      .when('/list', {
        templateUrl: 'views/route/list.html',
        controller: 'RouteListCtl'
      })
      .when('/list/:id', {
          templateUrl: 'views/route/detail.html',
          controller: 'RouteDetailCtl'
      })
      .otherwise({
        redirectTo: '/list'
      });
}]);

コントロールを2つ
routeApp.controller('RouteListCtl',function($scope) {
});
routeApp.controller('RouteDetailCtl',function($scope, $routeParams) {
    $scope.id = $routeParams.id;
});

の では,パラメータ きurlとパラメータなしurlのルーティング と を に するだけで, なhtmlページと は されない.
resolveの い
$routeProviderの2 のパラメータは、ルーティングの の です.ここにはresolveという な があります.resolveの は、このルーティングに る にresolveのデータの りを たなければならないことを します.すなわち、ターゲットルーティングをスキップする に、データの ロードに の を い、データの が である にのみ、ターゲットルーティングのテンプレートと するcontrollerをロードします.
$routeProvider
    .when("/news", {
        templateUrl: "newsView.html",
        controller: "newsController",
        resolve: {
            message: function(messageService){
                return messageService.getMessage();
        }
    }
})

の では、htmlページとjsはmessageに がある にのみロードされます.ルーティングがジャンプする に、resolveの のすべてのpromiseがトリガーされ、すべてのpromiseが しいresolveになった にのみルーティングが われ、$routeは$route ChangeSuccessのイベントを し、 しいresolveにされていない 、$routeは$route ChangeErrorのイベントを し、ルーティングの り えを します.
 
ui-router
ui-routerはngRouteに べて、1ページに のビューをネストしたり、ネストされた されたビューを したり、 のビューで1つのビューを したりすることができるなどの があります.インストール:
npm install angular-ui-router --save

にプロジェクトに :

するコントローラにui-routerの を します.
angular.module('myApp', ['ui.router']);

ui-routerに まれる はngRouteに ており、クラス を うことができます.
ngRoute
ui-router
ng-view
ui-view
$routeProvider
$stateProvider
$routeParams
$stateParams
$route
$state
1.$state パラメータ
パラメータ

url
の パス(^で まるのは パス)
views
viewsの サブビューには、 のテンプレート、コントローラ、プリロードデータが まれます.
abstract
テンプレートはアクティブにできません
template
HTML またはHTML を す
:htmlページ:
<body>
  <div>
  <div ui-view="filters">div>
  <div ui-view="mailbox">div>
  <div ui-view="priority">div>
div>
body>

js:
angular.module('myApp').config(['$stateProvider',function($stateProvider) {
$stateProvider
  .state('report',{
    views: {
      'filters': {
        template: '

Filter inbox

', controller: function($scope) {} }, 'mailbox': { templateUrl: 'partials/mailbox.html' }, 'priority': { template: '

Priority inbox

', resolve: { facebook: function() { return FB.messages(); } } } } }).state('blog',{ url:'/blog', views:{ 'container':{templateUrl:'templates/blog/layout.html'} } })

abstract テンプレート テンプレートはアクティブ できませんが、そのサブテンプレートはアクティブ できます. テンプレートは、 、$scope ドメインをサブテンプレートに したり、 じurlでカスタムデータやプリロードの を したりする くのビューを むテンプレートを します. のようになります.
$stateProvider
  .state('admin', {
    abstract: true,
    url: '/admin',
    template: '
' }) .state('admin.index', { url: '/index', template: '

Admin index

' }) .state('admin.users', { url: '/users', template: '
...'
});
2.$stateParams$stateparamsを してurl の なるパラメータを します.urlがそうである :
'/inbox/:inboxId/messages/{sorted}?from&to'

ユーザがアクセスすると、 されたurlは のようになります.
'/inbox/123/messages/ascending?from=10&to=20'

$stateParamsオブジェクトの は のとおりです.
{inboxId: '123', sorted: 'ascending', from: 10, to: 20}

3.$urlRouterProvider$urlRouterProviderはngRouteと にwhen()とotherwise()の2つの い があります.それ にもrule()メソッドがあり、urlのマッチングを えたり、 のルーティングの にルーティングを したりして、 は なパスの を します.
app.config(function($urlRouterProvider){
    //   url    
    $urlRouterProvider.rule(function ($injector, $location) {
        var path = $location.path(), normalized = path.toLowerCase();
        if (path != normalized) 
            return normalized;
    });
})

 
ルーティングのマッチング
url:"/user/:id" 
url:"/user/{id}"

の2つの き は じです.
//      contactId  1 8    
url: "/contacts/{contactId:[0-9]{1,8}}"

できますか?を して、 のようなクエリー・パラメータを します.
url: "/contacts?myParam"     //   "/contacts?myParam=value"

url: "/contacts?myParam1&myParam2"
//    "/contacts?myParam1=value1&myParam2=wowcool"

 
:https://www.cnblogs.com/lyy-2016/p/8762999.html