Home  >  Article  >  Web Front-end  >  AngularJS uses ui-route to implement multi-layer nested routing

AngularJS uses ui-route to implement multi-layer nested routing

小云云
小云云Original
2018-01-11 13:13:332074browse

This article mainly introduces the example of AngularJS using ui-route to implement multi-layer nested routing. The editor thinks it is quite good, so I will share it with you now and give it as a reference. Let’s follow the editor to take a look, I hope it can help everyone.

1. Expected results:

https://liyuan-meng.github.io/uiRouter-app/index.html

( Project address: https://github.com/liyuan-meng/uiRouter-app)

2. Analyze the topic requirements, give dependencies, and build the project

1. service:

(1) Query the people data checkPeople.service according to the conditions, or query all if no conditions are given.

(2) Get routing information getStateParams.service.

2. components:

(1) hello module: click the button button to change the content.

(2) peopleList module: displays the people list, click people to display people details. Depends on checkPeople.service module.

(3) peopleDetail module: displays people details, relying on the checkPeople.service module and getStateParams.service module.

3. Build the project:

As shown in the figure: the component directory is used to save all service modules and business modules, and the lib directory saves external references (I Angular.js1.5.8 and ui-route0.2.18 are used), the app.config.js file is used to configure routing, and index.html is used as the entry file.

3. Implement this example

1. Home page index.html


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <script src="./lib/angular.js"></script>
  <script src="./lib/angular-ui-route.js"></script>
  <script src="./app.config.js"></script>
  <script src="./components/core/people/checkPeople.service.js"></script>
  <script src="./components/core/people/getStateParams.service.js"></script>
  <script src="./components/hello/hello.component.js"></script>
  <script src="./components/people-list/people-list.component.js"></script>
  <script src="./components/people-detail/people-detail.component.js"></script>
</head>
<body ng-app="helloSolarSystem">
<p>
  <a ui-sref="helloState">Hello</a>
  <a ui-sref="aboutState">About</a>
  <a ui-sref="peopleState">People</a>
</p>

<ui-view></ui-view>

</body>
</html>

(1) Import lib files in and all used service and component service files.

(2) ng-app="helloSolarSystem" specifies that parsing starts from the helloSolarSystem module.

(3) Define view5643c5c8ec46989a1440c123e54787f3142226fc0f7a4611fbee3f36258ad78a

2. Configure routing app.config.js


&#39;use strict&#39;;

angular.module("helloSolarSystem", [&#39;peopleList&#39;, &#39;peopleDetail&#39;, &#39;hello&#39;,&#39;ui.router&#39;]).

  config([&#39;$stateProvider&#39;, function ($stateProvider) {

    $stateProvider.state(&#39;helloState&#39;, {
      url: &#39;/helloState&#39;,
      template:&#39;<hello></hello>&#39;

    }).state(&#39;aboutState&#39;, {
      url: &#39;/about&#39;,
      template: &#39;<h4>Its the UI-Router Hello Solar System app!</h4>&#39;

    }).state(&#39;peopleState&#39;, {
      url: &#39;/peopleList&#39;,
      template:&#39;<people-list></people-list>&#39;

    }).state(&#39;peopleState.details&#39;, {
      url:&#39;/detail/:id&#39;,
      template: &#39;<people-detail></people-detail>&#39;
    })
  }
]);

(1) Module name: helloSolarSystem;

(2) Inject 'peopleList', 'peopleDetail', 'hello', 'ui.router' modules.

(3) Configure the view control of the stateProvider service, for example, the first view controller named helloState: when ui-sref == "helloState", the route is updated to the value of url #/helloState, And the content displayed in 5643c5c8ec46989a1440c123e54787f3142226fc0f7a4611fbee3f36258ad78a is the content parsed by the 5d31ad12eb7f2467fa10436b397d69f6ce2196d7bcfa28427152ee3efb4b3e34 component.

(4) Implementation of nested routing: The view controller named peopleState is the parent routing. The view controller named peopleState.details is a child route. This is a relative routing method. The parent route will match.../index.html#/peopleState/, and the child route will match.../index.html#/peopleState/detail/x (x is /detail/:id the value of id in ). If you change it to absolute routing, you only need to write url:'^/detail/:id', then the sub-route will match.../index.html#/detail/x (x is in /detail/:id) id value).

4. Implement checkPeople.service (find people based on conditions)

checkPeople.sercice.js


##

&#39;use strict&#39;;

//根据条件(参数)查找信息。
angular.module(&#39;people.checkPeople&#39;, [&#39;ui.router&#39;]).
  factory(&#39;CheckPeople&#39;, [&#39;$http&#39;, function ($http) {
    return {
      getData: getData
    };
    function getData(filed) {
      var people;
      var promise = $http({
        method: &#39;GET&#39;,
        url: &#39;./data/people.json&#39;
      }).then(function (response) {
        if (filed) {
          people = response.data.filter(function (value) {
            if (Number(value.id) === Number(filed)) {
              return value;
            }
          })
        } else {
          people = response.data;
        }
        return people;
      });
      return promise;
    }
  }]);

(1) in getData In this function, we want to return an array that saves people information, but because when using the $http().then() service, this is an asynchronous request, and we don’t know when the request will end, so the world returns the people array. There is a problem. We noticed that $http().then() is a Promise object, so we can think of returning this object directly, so that we can use "result of function.then(function(data))" to get the asynchronous request The data comes.

3. Implement getStateParams.service (get routing information)

getStatePatams.service.js


"use strict";

angular.module("getStateParams", [&#39;ui.router&#39;]).
  factory("GetStateParams", ["$location", function ($location) {
    return {
      getParams: getParams
    };
    function getParams() {
      var partUrlArr = $location.url().split("/");
      return partUrlArr[partUrlArr.length-1];
    }
}]);

(1) getParams here The function returns the last data of the routing information, which is the people's ID. This service is somewhat special and not universal enough. It may need to be optimized to be more reasonable. But it does not affect our needs.

4. Implement hello module

hello.template.html


<p>
  <p ng-hide="hideFirstContent">hello solar sytem!</p>
  <p ng-hide="!hideFirstContent">whats up solar sytem!</p>
  <button ng-click="ctlButton()">click</button>
</p>

hello.component.js


&#39;use strict&#39;;

angular.module("hello", [])
  .component(&#39;hello&#39;, {
    templateUrl: &#39;./components/hello/hello.template.html&#39;,
    controller: ["$scope", 
      function HelloController($scope) {
        $scope.hideFirstContent = false;
        $scope.ctlButton = function () {
          this.hideFirstContent = !this.hideFirstContent;
        };
      }
    ]
  });

5. Implement the peopleList module:

peopleList.template.html

##

<p>
  <ul>
    <a ng-repeat="item in people" ui-sref="peopleState.details({id:item.id})">
      <li>{{item.name}}</li>
    </a>
  </ul>
  <ui-view></ui-view>
</p>

(1) Here1eb9cf0f0f29abb6beab9f9ddb19beab142226fc0f7a4611fbee3f36258ad78a used to display the sub-component pepleDetail of peopleList

peopleList.component.js

&#39;use strict&#39;;

angular.module("peopleList", [&#39;people.checkPeople&#39;])
  .component(&#39;peopleList&#39;, {
    templateUrl: &#39;./components/people-list/people-list.template.html&#39;,
    controller: [&#39;CheckPeople&#39;,&#39;$scope&#39;,
      function PeopleListController(CheckPeople, $scope) {
        $scope.people = [];
        CheckPeople.getData().then(function(data){
          $scope.people = data;
        });
      }
    ]
  });

6. Implement the peopleDetail module

peopleDetail.template.html

<ul ng-repeat="item in peopleDetails track by $index">
  <li>名字: {{item.name}}</li>
  <li>介绍: {{item.intro}}</li>
</ul>

peopleDetail.component.js

&#39;use strict&#39;;

angular.module("peopleDetail", [&#39;people.checkPeople&#39;, &#39;getStateParams&#39;])
  .component(&#39;peopleDetail&#39;, {
    templateUrl: &#39;./components/people-detail/people-detail.template.html&#39;,
    controller: [&#39;CheckPeople&#39;, &#39;GetStateParams&#39;, &#39;$scope&#39;,
      function peopleDetailController(CheckPeople, GetStateParams, $scope) {
        $scope.peopleDetails = [];
        CheckPeople.getData(GetStateParams.getParams()).then(function(data){
          $scope.peopleDetails = data;
        });
      }
    ]
  });

7. Source code: https://github.com/liyuan-meng/uiRouter-app

Related recommendations:


Sample code for usage of routing Ui-router module in AngularJS

A brief analysis of the ui-router and ng-grid modules in angularJS

Usage of ui-router_html/css_WEB-ITnose

The above is the detailed content of AngularJS uses ui-route to implement multi-layer nested routing. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn