返回顶部
首页 > 资讯 > 前端开发 > JavaScript >从 Angular Route 中提前获取数据的方法详解
  • 821
分享到

从 Angular Route 中提前获取数据的方法详解

2024-04-02 19:04:59 821人浏览 泡泡鱼
摘要

目录介绍你为什么应该使用 Resolver在应用中使用 Resolver创建服务并编写逻辑获取列表数据怎么应用一个预加载导航总结介绍 提前获取意味着在数据呈现在屏幕之前获取到数据。本

介绍

提前获取意味着在数据呈现在屏幕之前获取到数据。本文中,你将学到,在路由更改前怎么获取到数据。通过本文,你将学会使用 resolver, 在 angular App 中应用 resolver,应用到一个公共的预加载导航。

你为什么应该使用 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,页面中,你将看到下面的效果。

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 中。效果如下快照。

至此,你已经了解完怎么应用 resolver 在你的项目中了。

总结

结合用户体验设计,在 resolver 的加持下,你可以提升你应用的表现。了解更多,你可以戳官网。

本文是译文,采用的是意译的方式,其中加上个人的理解和注释,原文地址是:www.pluralsight.com/guides/pref…

到此这篇关于从 Angular Route 中提前获取数据的文章就介绍到这了,更多相关Angular Route获取数据内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 从 Angular Route 中提前获取数据的方法详解

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

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

猜你喜欢
  • 从 Angular Route 中提前获取数据的方法详解
    目录介绍你为什么应该使用 Resolver在应用中使用 Resolver创建服务并编写逻辑获取列表数据怎么应用一个预加载导航总结介绍 提前获取意味着在数据呈现在屏幕之前获取到数据。本...
    99+
    2024-04-02
  • Angular Route中如何提前获取数据
    这篇文章主要讲解了“Angular Route中如何提前获取数据”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Angular Route中如何提前获取数据”...
    99+
    2024-04-02
  • 如何从gin中的前端获取数据?
    小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《如何从gin中的前端获取数据?》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!问题内容...
    99+
    2024-04-05
  • 从json中获取数据的方法有哪些
    从JSON中获取数据的方法主要有以下几种:1. 使用编程语言的内置JSON解析器:大多数编程语言都提供了内置的JSON解析器,可以通...
    99+
    2023-08-18
    json
  • Django 如何从request中获取前端数据
    Django ###request 如果说 urls.py 是 Django 中前端页面和后台程序桥梁,那么 request 就是桥上负责运输的小汽车 可以说后端接收到的来至前端的信...
    99+
    2024-04-02
  • Django怎么从request中获取前端数据
    这篇文章主要介绍Django怎么从request中获取前端数据,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!go适合做什么go是golang的简称,而golang可以做服务器端开发,且golang很适合做日志处理、数...
    99+
    2023-06-14
  • Python从csv文件中读取数据及提取数据的方法
    目录1.从csv文件中读取数据2.数据切割数据保存在csv文件中 1.从csv文件中读取数据 参数header=None的有无 (1)没有header=None——直接将csv表中...
    99+
    2024-04-02
  • Android编程获取GPS数据的方法详解
    本文实例讲述了Android编程获取GPS数据的方法。分享给大家供大家参考,具体如下: GPS是Android系统中重要的组成部分,通过它可以衍生出众多的与位置相关的应用。 A...
    99+
    2022-06-06
    方法 gps Android
  • C#实现从PDF中提取表格的方法详解
    目录程序环境从PDF中提取表格具体步骤完整代码PDF是办公中比较常见的一种文件格式,在工作中应用也越来越普遍。由于PDF文件集成度和安全可靠性都较高,所以在PDF中编辑内容是一件比较...
    99+
    2022-11-13
    C# PDF提取表格 C# PDF 表格
  • 二、Gin 路由(Route)和获取请求参数的方法
    路由(Route)方法 支持方法 路由方法有 GET, POST, PUT, PATCH, DELETE 和 OPTIONS,当然匹配所有类型的请求方法是 Any package main import ( "githu...
    99+
    2024-04-02
  • Javaweb中Request获取表单数据的四种方法详解
    目录表单代码request.getParamter(String name);通过name获取值request.getParamterValues(String name);通过na...
    99+
    2024-04-02
  • Android编程获取图片数据的方法详解
    本文实例讲述了Android编程获取图片数据的方法。分享给大家供大家参考,具体如下:网络的访问在我们日常生活中太重要了,如果没有网络我们的生活将会是什么样子呢?Android手机和浏览器也是一样的,也可以通过网络通讯获取数据,如调用webs...
    99+
    2023-05-30
    android 图片 roi
  • 详解vue+nodejs获取多个表数据的方法
    目录效果前端实现后端实现总结读取两个表的数据 将用户及图像联系在一起 效果 前端实现 修改关联的时候,前端向后端传入array[number],后端存为字符串 这时在前端获取数据时...
    99+
    2024-04-02
  • SpringBoot中获取profile的方法详解
    目录spring boot与profile静态获取方式autowire ProfileConfigspring boot与profile spring boot 的项目中不再使用xm...
    99+
    2024-04-02
  • 如何获取PHP get方法提交的数据
    本篇内容主要讲解“如何获取PHP get方法提交的数据”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何获取PHP get方法提交的数据”吧!在PHP中,可以使用“$_GET”全局变量来获取fo...
    99+
    2023-06-20
  • PHP实现数据库读取前几条数据的方法详解
    PHP是一种广泛应用于web开发的脚本语言,它具有强大的数据库操作能力。在实际开发中,经常会遇到需要读取数据库中前几条数据的需求。本文将详细介绍PHP如何实现数据库读取前几条数据,并给...
    99+
    2024-04-02
  • Android 如何获取传感器的数据方法详解
    目录1 传感器简介2 传感器的使用2.1 获取传感器服务2.2 获取待监听的传感器2.3 注册传感器的监听器2.4 注销传感器的监听器3 示例代码1 传感器简介 传感器 Sensor...
    99+
    2024-04-02
  • Python Django获取URL中的数据详解
    目录Django获取URL中的数据URL路径参数使用path函数使用re_path函数URL关键字形式总结Django获取URL中的数据 URL中的参数一般有两种形式。如下所示: ...
    99+
    2024-04-02
  • Python快速从视频中提取视频帧的方法详解
    目录1、抽取视频帧2、多线程方法3、整体代码补充Python快速提取视频帧(多线程) 今天介绍一种从视频中抽取视频帧的方法,由于单线程抽取视频帧速度较慢,因此这里我们增加了多线程的方...
    99+
    2024-04-02
  • Django中从mysql数据库中获取数据传到echarts方式
    尝试了几种方法,感觉过于复杂,于是自己写了一个方法。 (1)首先在要绘图的页面传入从数据库中提取的参数,这一步通过views可以实现; (2)然后是页面加载完成时执行的函数ready,调用方法f; (3)在函数f中获...
    99+
    2022-05-27
    Django mysql echarts
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作