iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Angular Route中如何提前获取数据
  • 751
分享到

Angular Route中如何提前获取数据

2024-04-02 19:04:59 751人浏览 独家记忆
摘要

这篇文章主要讲解了“angular Route中如何提前获取数据”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Angular Route中如何提前获取数据”

这篇文章主要讲解了“angular Route中如何提前获取数据”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Angular Route中如何提前获取数据”吧!

Angular Route中如何提前获取数据

提前获取意味着在数据呈现在屏幕之前获取到数据。

你为什么应该使用 Resolver

Resolver 在路由跟组件之间扮演着中间件服务的角色。假设你有一个表单,没有数据时,你想向用户一个空的表单,当在加载用户数据时展示一个 loader,然后当数据返回时,填充表单并隐藏 loader

通常,我们都会在组件的 nGonInit() 钩子函数中获取数据。也就是说,组件加载完之后,我们发起数据请求。

ngOnInit() 中操作,我们需要在每个需要的组件加载后,在其路由页面中添加 loader 展示。Resolver 可以简化 loader 的添加使用。你可以只添加一个适用于每个路由的 loader,而不是每个路由中都添加 loader

本文将结合示例来解析 resolver 的知识点。以便于你可以牢记它并在项目中使用它。

在应用中使用 Resolver

为了在应用中使用 resolver,你需要准备一些接口。你可以通过 JSONPlaceholder 来模拟,而不需要自己开发

jsONPlaceholder 是一个很棒的接口资源,你可以借助它更好学习前端的相关概念而不被接口所约束。

现在,接口的问题解决了,我们可以开始 resolver 的应用了。一个 resolver 就是一个中间件服务,所以我们将创建一个服务。

$ ng g s resolvers/demo-resolver --skipTests=true

--skipTests=true 跳过生成测试文件

src/app/resolvers 文件夹中创建了一个服务。resolver 接口中有一个 resolve() 方法,它有两个参数:routeActivatedRouteSnapshot 的实例)和 state(RouterStateSnapshot 的实例)。

loader 通常是在 ngOnInit() 中编写所有的 ajax 请求,但是逻辑将会在 resolver 中实现,替代 ngOnInit()

接着,创建一个服务来获取 JSONPlaceholder 中列表数据。然后在 resolver 中底调用,接着在路由中配置 resolve信息,(页面将会等待)直到 resolver 被处理。在 resolver 被处理之后,我们可以通过路由来获取数据然后展示在组件中。

创建服务并编写逻辑获取列表数据

$ ng g s services/posts --skipTests=true

现在,我们成功创建了服务,是时候编写一个 AJAX 请求的逻辑了。

model 的使用能够帮助我们减少错误。

$ ng g class models/post --skipTests=true

post.ts

export class Post {  id: number;
  title: string;
  body: string;
  userId: string;
}

model 就绪,是时候获取帖子 post 的数据了。

post.service.ts

import { Injectable } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { Post } from "../models/post";

@Injectable({
  providedIn: "root"
})
export class PostsService {
  constructor(private _http: HttpClient) {}

  getPostList() {
    let URL = "https://jsonplaceholder.typicode.com/posts";
    return this._http.get<Post[]>(URL);
  }
}

现在,这个服务随时可被调用。

demo-resolver.service.ts

import { Injectable } from "@angular/core";
import {
  Resolve,
  ActivatedRouteSnapshot,
  RouterStateSnapshot
} from "@angular/router";
import { PostsService } from "../services/posts.service";

@Injectable({
  providedIn: "root"
})
export class DemoResolverService implements Resolve<any> {
  constructor(private _postsService: PostsService) {}

  resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    return this._postsService.getPostList();
  }
}

帖子列表数据从 resolver 中返回。现在,你需要一个路由去配置 resolver,从路由获取数据,然后让数据展示在组件中。为了进行路由跳转,我们需要创建一个组件。

$ ng g c components/post-list --skipTests=true

为了路由可见,在 app.component.ts 添加 router-outlet

<router-outlet></router-outlet>

现在,你可以配置 app-routing.module.ts 文件了。下面的片段代码将有助于你理解路由配置 resolver

app-routing-module.ts

import { NgModule } from "@angular/core";
import { Routes, RouterModule } from "@angular/router";
import { PostListComponent } from "./components/post-list/post-list.component";
import { DemoResolverService } from "./resolvers/demo-resolver.service";

const routes: Routes = [
  {
    path: "posts",
    component: PostListComponent,
    resolve: {
      posts: DemoResolverService
    }
  },
  {
    path: "",
    redirectTo: "posts",
    pathMatch: "full"
  }
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule {}

一个 resolve 已经添加到路由配置中了,它将发起一个 HTTP 请求,然后当 HTTP 请求成功返回后,允许组件初始化。路由将组装获取到的 HTTP 请求返回的数据。

怎么应用一个预加载导航

向用户展示一个请求正在进行,我们在 AppComponent 中编写一个公共且简单的 loader。你可以根据需要自定义。

app.component.html

<div class="loader" *ngIf="isLoader">
  <div>Loading...</div>
</div>
<router-outlet></router-outlet>

app.component.ts

import { Component } from "@angular/core";
import {
  Router,
  RouterEvent,
  NavigationStart,
  NavigationEnd
} from "@angular/router";

@Component({
  selector: "app-root",
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.sCSS"]
})
export class AppComponent {
  isLoader: boolean;

  constructor(private _router: Router) {}

  ngOnInit() {
    this.routerEvents();
  }

  routerEvents() {
    this._router.events.subscribe((event: RouterEvent) => {
      switch (true) {
        case event instanceof NavigationStart: {
          this.isLoader = true;
          break;
        }
        case event instanceof NavigationEnd: {
          this.isLoader = false;
          break;
        }
      }
    });
  }
}

当导航开始,isLoader 值被赋予 true,页面中,你将看到下面的效果。

Angular Route中如何提前获取数据

resolver 处理完之后,它将会被隐藏。

现在,是时候从路由中获取值并将其展示出来。

port-list.component.ts

import { Component, OnInit } from "@angular/core";
import { Router, ActivatedRoute } from "@angular/router";
import { Post } from "src/app/models/post";

@Component({
  selector: "app-post-list",
  templateUrl: "./post-list.component.html",
  styleUrls: ["./post-list.component.scss"]
})
export class PostListComponent implements OnInit {
  posts: Post[];

  constructor(private _route: ActivatedRoute) {
    this.posts = [];
  }

  ngOnInit() {
    this.posts = this._route.snapshot.data["posts"];
  }
}

如上所示,post 的值来自 ActivatedRoute 的快照信息 data。这值都可以获取,只要你在路由中配置了相同的信息。

我们在 HTML 进行如下渲染。

<div class="post-list grid-container">
  <div class="card" *ngFor="let post of posts">
    <div class="title"><b>{{post?.title}}</b></div>
    <div class="body">{{post.body}}</div>
  </div>
</div>

CSS 片段样式让其看起来更美观。

port-list.component.css

.grid-container {
  display: grid;
  grid-template-columns: calc(100% / 3) calc(100% / 3) calc(100% / 3);
}
.card {
  margin: 10px;
  box-shadow: black 0 0 2px 0px;
  padding: 10px;
}

推荐使用 scss 预处理器编写样式

从路由中获取数据之后,它会被展示在 HTML 中。效果如下快照。

Angular Route中如何提前获取数据

感谢各位的阅读,以上就是“Angular Route中如何提前获取数据”的内容了,经过本文的学习后,相信大家对Angular Route中如何提前获取数据这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Angular Route中如何提前获取数据

本文链接: https://www.lsjlt.com/news/98307.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Angular Route中如何提前获取数据
    这篇文章主要讲解了“Angular Route中如何提前获取数据”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Angular Route中如何提前获取数据”...
    99+
    2024-04-02
  • 从 Angular Route 中提前获取数据的方法详解
    目录介绍你为什么应该使用 Resolver在应用中使用 Resolver创建服务并编写逻辑获取列表数据怎么应用一个预加载导航总结介绍 提前获取意味着在数据呈现在屏幕之前获取到数据。本...
    99+
    2024-04-02
  • Django如何获取前端数据
    这篇文章主要介绍“Django如何获取前端数据”,在日常操作中,相信很多人在Django如何获取前端数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Django如何获取前端数据”的疑惑有所帮助!接下来,请跟...
    99+
    2023-07-05
  • php中如何获取数组前几位数据
    这篇文章主要介绍了php中如何获取数组前几位数据,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php中可用array_slice()函数获取数组前几位数据,该函数可以返回数组...
    99+
    2023-06-15
  • 如何从gin中的前端获取数据?
    小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《如何从gin中的前端获取数据?》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!问题内容...
    99+
    2024-04-05
  • Django 如何从request中获取前端数据
    Django ###request 如果说 urls.py 是 Django 中前端页面和后台程序桥梁,那么 request 就是桥上负责运输的小汽车 可以说后端接收到的来至前端的信...
    99+
    2024-04-02
  • Python数据获取如何实现图片数据提取
    本篇内容主要讲解“Python数据获取如何实现图片数据提取”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python数据获取如何实现图片数据提取”吧!有很多功能&hellip;比如用户画...
    99+
    2023-06-30
  • angular怎么获取数据给后端
    要将数据发送给后端,可以使用Angular的HttpClient模块。 首先,需要在项目中导入HttpClient模块。在你的mod...
    99+
    2023-10-24
    angular
  • React中如何获取数据
    React中如何获取数据,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、使用生命周期方法请求数据应用程序Employees.org做两件...
    99+
    2024-04-02
  • php如何获取表单提交的数据
    php获取表单有下列几个步骤:1.首先,编写PHP和HTML文件2.表单设置action,用post类型的方法向php提交数据。3.编写php获取表单的代码。4.利用编写的php文件检验是否能获取表单。5.查验结果是否成功。具体操作步骤:编...
    99+
    2024-04-02
  • PHP中如何获取POST数据
    PHP中如何获取POST数据,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。(一)表单POST方式提交情况下PHP获取POST数据$_POST 与 php://input可以取到...
    99+
    2023-06-17
  • 如何获取redis中的数据
    redis 中获取数据的常用方式有:get:直接获取指定键的值。mget:同时获取多个键的值,返回一个列表。hget:获取哈希表中指定 field 的值。hmget:获取哈希表中多个 f...
    99+
    2024-04-20
    redis
  • 如何获取PHP get方法提交的数据
    本篇内容主要讲解“如何获取PHP get方法提交的数据”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何获取PHP get方法提交的数据”吧!在PHP中,可以使用“$_GET”全局变量来获取fo...
    99+
    2023-06-20
  • Python数据获取实现图片数据提取
    目录一、利用exifread提取图片的EXIF信息二、循环遍历图片信息比如我随便从手机上传一张图片到我的电脑里,通过python可以获取这张照片的所有信息。如果是数码相机拍摄的照片,...
    99+
    2024-04-02
  • redis如何获取数据
    redis 提供以下获取数据的方式:get:获取指定键的值。mget:同时获取多个键的值。hget:获取哈希表中指定字段的值。hgetall:获取哈希表中所有字段的值。lindex:获取...
    99+
    2024-04-20
    redis
  • Django怎么从request中获取前端数据
    这篇文章主要介绍Django怎么从request中获取前端数据,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!go适合做什么go是golang的简称,而golang可以做服务器端开发,且golang很适合做日志处理、数...
    99+
    2023-06-14
  • html如何获取数据
    html不能直接获取数据。获取数据的方法包括:使用javascript通过html元素获取数据或发送ajax请求。使用服务器端脚本语言连接数据库或其他数据源,或调用api。 HTML如...
    99+
    2024-04-11
    数据访问 html元素
  • 如何获取listview选中的数据
    要获取ListView选中的数据,您可以使用以下步骤:1. 在ListView的适配器中,为每个item设置一个点击事件监听器。2....
    99+
    2023-08-14
    listview
  • JavaScript中如何获取当前日期
    本篇文章为大家展示了JavaScript中如何获取当前日期,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。function showDate()  {     ...
    99+
    2023-06-03
  • python中如何获取当前时间
    python中获取当前时间的方法:1、在win操作系统中找到python程序目录;2、打开idle工具;3、在idle中新建一个shell脚本;4、输入“import datetime”指令导入datetime模块;5、通过“now_tim...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作