Angular学习笔记(五)之Angular服务及实现数据前端持久化

【前端】Angular8入门教程笔记+Angular material安装与使用 一、 Angular介绍 Angular是谷歌开发的一款开源的web前端框架,诞生于2009年,由Misko Hevery 等人创建,后为Google所收购。是一款优秀的前端JS框架,已经被用于Google的多款产品当中。 根据项目数统计angular(1.x 、2.x 、4.x、5.x、6.x、7.x 、8.x、9.x)是现在网上使用量最大的框架。 Angular基于TypeScript和r... 阅读详情

这篇笔记主要是以网上的一个视频教程为基础,记录视频中的实践操作,主要实现了一个类似于京东搜索和toDoList的操作,其中包括的知识点主要是Angular组件如何调用服务,以及通过服务实现Angular前端数据的持久化。

先看最终的效果,说明,这个只是根据视频的一个Angular的示例,前端的样式几乎没有,重点是学习Angular的知识点。

      在第一个搜索demo中,输入框中每次输入内容后,点击搜索,则下面的历史列表中会记录搜索的历史,当然也可以删除,同时数据会记录到localStorage中,页面刷新后仍然可以看到。

    第二个toDoList示例中,在输入框中输入代办事项后,回车,则在代办列表中多了条记录,勾选复选框后,代办事项变更为已办事项,同样数据会保存在localStorage中,页面刷新后,数据依然可看。


1、创建项目及组件

ng new angulardemo

ng g c demo/search

ng g c demo/todolist

2、编写search组件代码,这里直接贴代码:

search.component.css

h2{
  text-align: center;
}
.search{
  width: 400px;
  margin: 20px auto;
}
.search input{
  margin-bottom: 20px;
  width: 300px;
  height: 30px;
}
.search button{
  width: 80px;
  height: 32px;
}
.search ul li{
  list-style-type: none;
}

search.component.ts

import { Component, OnInit } from '@angular/core';
import {StorageService} from '../services/storage.service';

@Component({
  selector: 'app-search',
  templateUrl: './search.component.html',
  styleUrls: ['./search.component.css']
})
export class SearchComponent implements OnInit {

  public keywords = '';
  public historyList: any[] = [];
  constructor(public storage: StorageService) { }

  ngOnInit() {
    console.log('页面每次刷新的时候会触发');
    const searchlist = this.storage.get('searchlist');
    if (searchlist) {
      this.historyList = searchlist;
    }
  }
  // 搜索
  doSearch() {
    if (this.historyList.indexOf(this.keywords) === -1) {
      this.historyList.push(this.keywords);
      this.storage.set('searchlist', this.historyList);
    }
    this.keywords = '';
    console.log(this.keywords);
  }
  // 删除
  deleteHistory(key) {
    this.historyList.splice(key, 1);
    this.storage.set('searchlist', this.historyList);
  }

}

search.component.html

<h2>京东搜索</h2>
<div class="search">
    <input type="text" [(ngModel)]="keywords"> <button (click)="doSearch();">搜索</button>


    <hr>

    <ul>
    <li *ngFor="let item of historyList;let key=index" >{{item}}---<button  (click)="deleteHistory(key);">✘</button></li>
    </ul>
</div>

3、创建服务:storage.service

ng g s services/storage

storage.service.ts

import { Injectable } from '@angular/core';
import {__values} from 'tslib';

@Injectable({
  providedIn: 'root'
})
export class StorageService {

  constructor() { }

  // 获取数据
  get(key: any) {
    return JSON.parse(localStorage.getItem(key));
  }
  // 设置数据
  set(key: any, value: any) {
    localStorage.setItem(key, JSON.stringify(value));
  }
  // 删除数据
  remove(key: any) {
    localStorage.removeItem(key);
  }
}

4、编写todolist组件代码

todolist.component.css

h2{
  text-align: center;
}
.todolist{
  width: 400px;
  margin: 20px auto;
}
.form_input{
  margin-bottom: 20px;
  width: 300px;
  height: 30px;
}
/*.todolist button{*/
  /*width: 80px;*/
  /*height: 32px;*/
/*}*/
.todolist ul li{
  list-style-type: none;
  line-height: 40px;
}

todolist.component.ts

import { Component, OnInit } from '@angular/core';
import {StorageService} from '../services/storage.service';

@Component({
  selector: 'app-todolist',
  templateUrl: './todolist.component.html',
  styleUrls: ['./todolist.component.css']
})
export class TodolistComponent implements OnInit {

  public keywords = '';
  public todoList: any[] = [];
  constructor(public storage: StorageService) { }

  ngOnInit() {
    const todolist = this.storage.get('todolist');
    if (todolist) {
      this.todoList = todolist;
    }
  }

  doAdd(e) {
    if (e.keyCode === 13) {
      // 回车
      const fla = this.todoListHasKey(this.todoList, this.keywords);
      if (!fla) {
        this.todoList.push({
          title: this.keywords,
          status: 0         // 0代表待办,1代表已完成
        });
        this.storage.set('todolist', this.todoList);

      } else {
        alert('数据已经存在');
      }
      this.keywords = '';
    }

  }
  deleteData(key) {
    this.todoList.splice(key, 1);
    this.storage.set('todolist', this.todoList);
  }

  todoListHasKey(todolist: any, key: any) {
    // 异步,会存在问题
    // todolist.forEach(value => {
    //   if (value.title === key) {
    //     return true;
    //   }
    // })
    for (let i = 0; i < todolist.length; i++) {
        if (todolist[i].title === key) {
          return true;
        }
    }
    return false;

  }

  checkboxChange() {
    this.storage.set('todolist', this.todoList);
  }

}

todolist.component.html

<h2>toDoList</h2>
<div class="todolist">
  <input class="form_input" type="text" [(ngModel)]="keywords" (keyup)="doAdd($event);">


  <hr>
  <h3>待办事项</h3>

  <ul>
    <li *ngFor="let item of todoList;let key=index"  [hidden]="item.status ==1">
      <input type="checkbox" [(ngModel)]="item.status" (change)="checkboxChange();">{{item.title}}---<button  (click)="deleteData(key);">✘</button>
    </li>
  </ul>
  <hr>
  <h3>已完成事项</h3>
  <ul>
    <li *ngFor="let item of todoList;let key=index" [hidden]="item.status ==0">
      <input type="checkbox" [(ngModel)]="item.status" (change)="checkboxChange();">{{item.title}}---<button  (click)="deleteData(key);">✘</button>
    </li>
  </ul>
</div>

5、app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import {FormsModule} from '@angular/forms';
import { SearchComponent } from './demo/search/search.component';
import { TodolistComponent } from './demo/todolist/todolist.component';
import { StorageService } from './demo/services/storage.service';

@NgModule({
  declarations: [
    AppComponent,
    SearchComponent,
    TodolistComponent

  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    FormsModule

  ],
  providers: [StorageService],
  bootstrap: [AppComponent]
})
export class AppModule { }

app.module.html

<!--The content below is only a placeholder and can be replaced.-->
<!--<app-my-com-name></app-my-com-name>-->
<!--<app-home></app-home>-->
<router-outlet></router-outlet>
<app-search></app-search>
<br>
<br>
<br>
<br>
<br>
<br>
<app-todolist></app-todolist>

 

手把手教你学Simulink--巴特沃斯滤波器设计与实现仿真 巴特沃斯滤波器的设计目标是拥有尽可能平滑的通带响应,这意味着在通带内信号衰减最小且没有波动。这种类型的滤波器非常适合用于音频处理、生物医学信号处理以及其他需要高保真度的应用场景。根据应用需求的不同,可以选择低通、高通、带通或带阻滤波器。明确你的系统需求,如输入信号类型(正弦波、方波等)、滤波器类型(低通、高通、带通或带阻)、截止频率、滤波器阶数等。假设我们需要设计一个4阶低通巴特沃斯滤波器,其截止频率为1kHz,用来过滤掉高于1kHz的所有频率成分。 阅读详情

相关推荐

Unity布娃娃系统 Ragdoll Mecanim Mixer使用

6. 选完之后,左键下面的hip等角色各个部位不松开鼠标,拖拽连接到上面Amature的各个部位,如图,下面所有部位都连接完之后,第二步点击Configure Selected Bones确认你的部位连接选择。要做一个布娃娃和动画混合的项目,这个插件是比较不错的,搜了一圈文章教程也是抄来抄去,抄的没有头没有尾,自己摸索着用了一下,记录使用过程吧。8. 之后就点击步骤7图一中的Create Ragdoll,会发现player结构发生变化,如图。4. 添加完脚本之后会显示你的player结构,如图。

SuShengQuanshiW的博客 1650

angular--服务初识,数据持久化todolist

一、原理 angular的理念是所有功能模块都是一个个组件,组件可相互引用组合,但组件内部 【ts文件】中的方法是不能互相调用的。 所以提供了一个服务的概念,【和Java的service一样】; 1、组件可以调用service内的方法 2、组件和组件之间不能互相调用ts文件中的方法,但组件之间可以传值 2、service却不能调用组件内的方法 3、service和service之间是可以互相调用的 ps:纯属个人理解,如有不对请指正 # 命令模板 ng g service 服务名称..

aliaichidantong的博客 283

机械臂标准DH建模及正运动学分析(以IRB4600型工业机械臂为例)

对于工业机械臂而言,运动学是不考虑力学特性的情况下对机械臂的几何参数与其位置、速度、加速度等运动特性的关系研究。DH建模是运动学的基础,全称为Denavit-Hartenberg建模方法,是一种广泛应用于机器人运动学中的建模技术。该方法通过在每个连杆上建立坐标系,并利用齐次坐标变换来实现连杆之间的坐标转换。通过依次变换,可以推导出末端执行器相对于基坐标系的位姿,从而建立机器人的运动学方程。以IRB4600型六自由度工业机械臂为例,选择标准DH建模方法,建立其正运动学模型。

chen_mp的博客 1万+

angular多数据源切换

1.引入dc-pojo包 com.sctech dc-pojo 0.0.12-frame 2.确保数据库驱动在pom.xml引入 3.application.yml进行多数据源的配置 首先,进行默认数据源的配置,如不人工切换,默认使用该数据库 4.指定其他数据源的配置 5.数据源切换 在需要切换数据源的方法前面使用@TargetDataSource(name = “”),name指定上面定义的数据源 ...

qq_41523445的博客 179

CH376S模块实战:如何通过串口轻松实现单片机与U盘的数据交互

本文详细介绍了如何利用CH376S模块,通过串口通信实现单片机与U盘的数据交互。文章从模块原理、硬件连接到核心指令集进行了全面解析,并提供了基于STM32的实战代码示例。CH376S模块极大地简化了USB协议和文件系统的复杂性,使开发者能快速为嵌入式设备添加便捷的数据存储与导出功能,适用于数据记录、配置导入等多种应用场景。

weixin_29165725的博客 458

5分钟搞定!用Keil MDK将STM32F103C8T6工程无缝迁移到ZET6开发板

本文详细介绍了如何在Keil MDK环境下快速将STM32F103C8T6工程迁移到ZET6开发板,涵盖硬件差异对比、工程配置调整、外设适配及编译排错等关键步骤,帮助开发者5分钟内完成工程移植,大幅提升开发效率。

weixin_30879169的博客 409

Angular实现简单的toDoList以及数据持久化存储

[](()第二例:ToDoList 功能概述: 在第一例的基础上, 我们还可以通过点击checkBox来实时更改数据状态 HTML: 搜索条 <input type=“text” [(ngModel)]=“keyword” (keyup)=“doAdd($event)” /> 正在运行 <input type=“checkbox” [(ngModel)]=“item.status” (change)="changeCheckBox() "/>{{ item.tit

m0_67619362的博客 334

计算机视觉:暗通道去雾算法的原理及python实现

在绝大多数非天空的局部区域中,某些像素总会至少有一个颜色通道的值很低。对于一幅图像J(x),其暗通道的数学定义表示如下:其中,Ω(x)表示以x为中心的局部区域,上标c表示RGB三个通道。该公式的意义用代码表达也很简单,首先求出每个像素RGB分量中的最小值,存入一副和原始图像大小相同的灰度图中,然后再对这幅灰度图进行最小值滤波,滤波的半径由窗口大小决定。

weixin_51998427的博客 1万+

在Angular 6.x 中使用ng2-smart-table中的ServerDataSource及添加特殊情况处理

上文链接从零开始在Angular 6中使用ng2-smart-table组件中的LocalDataSource

3956

手把手教你用LangChain4j打造一个“会追问”的AI客服:以航空货运下单为例

本文详细介绍了如何使用LangChain4j构建一个能够主动追问的航空货运AI客服系统。通过对话状态管理、信息缺口识别和渐进式引导等核心技术,实现高效的多轮对话交互。文章包含从交互设计到代码实现的完整指南,特别强调了提示词(Prompt)在优化AI行为中的关键作用,帮助开发者打造更智能的客服解决方案。

weixin_28731223的博客 154

1.14、基于NARX神经网络的磁悬浮建模(matlab)

数据准备:首先,需要准备用于训练和测试的磁悬浮系统的输入和输出数据,包括磁力、电流、位置、速度等信息。数据可以被保存在MATLAB的数据文件中,并加载到工作空间中。使用MATLAB的神经网络工具箱,创建一个NARX神经网络。需要定义网络的层次结构、节点数、激活函数等参数。通常,NARX网络包括自回归层和外部输入层。数据预处理:对加载的数据进行预处理,包括去除噪声、归一化处理等操作,以确保数据质量和网络训练的稳定性。使用MATLAB的训练函数,如trainlm或者trainbr,对NARX神经网络进行训练。

XU157303764的博客 1999

自定义连接池&实现DataSource的连接池&dbcp连接池(BasicDataSource)&c3p0连接池(ComboPooledDataSource)&druid连接池(DruidDataSo

1.为什么要用连接池:节省创建连接对象和关闭连接对象的时间,提高使用效率. 2.连接池:存放多个连接对象的容器. 3.自定义连接池:目地让我们了解连接池的原理. eg:public class MyPool { /** *准备一个集合作为连接池,存放连接对象 */ public static LinkedList<Connection> pool...

Java_LXM的博客 1354

【FPGA教程案例55】深度学习案例2——基于FPGA的CNN卷积神经网络之ReLu激活层verilog实现

在本课程中,我们将对CNN的ReLu函数模块的FPGA实现做详细的介绍和学习。从仿真结果可知,通过Rule激活函数之后,小于的输入数据输出为0,否则输出是输入本身。,我们对CNN的基本原理有了初步认识。ReLu函数具备如下优缺点。按照课程1相似的操作方式。

FPGA/MATLAB学习教程/源码/项目合作开发 2694

Angular入门学习笔记

Angular学习笔记,Angualr安装,Angular入门,Angular实战,ANgualr路由守卫

K One 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

angular之服务和数据持久化

文章目录一、angular服务二、数据持久化 一、angular服务 如果两个不相关的组建想要相互调用,那么就需要引入服务这个功能。 如何创建和使用服务 1、创建一个服务。方法和创建组建类似,在终端输入如下 2、如果想要使用该服务的话,首先需要在根模块modules里引入该服务。 注释的两个地方分别是引入和配置。 3、如果想要在某个建立的模块里面使用该服务,就需要在该模块里面引入该服务。 例如想...

aaaPostcard的博客 500

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Angular7创建一个服务及数据持久化

Angular7 服务及数据持久化 服务 先创建一个服务ng service services/storage 创建完服务需要在app.component.ts中引用和声明 import { StorageService } from './services/storage.service'; providers: [StorageService], 在服务中定义一个公有的方法 g...

weixin_42959207的博客 958

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Angular 服务(service)实现 ToDoList 数据持久化

继续上一篇【ToDoList 功能】功能完善,通过ng服务和BOM对象【Local Storage】实现数据的持久化。 首先通过 Angular CLI命令【nggenerate serviceservices/data-storange】创建一个服务【data-storange】,代码示例如下: import { Injectable } from '@angular/core'; ...

ChaITSimpleLove的博客 421

【angular教程240107】04 Dom及表单双向数据绑定,ToDoList+service 服务+实现数据的持久化

)// 数据查重// 搜索后,输入栏设置为空// 从historyList里面移除该数据})// 设置数据// 删除数据ToDoList是一款非常优秀的 任务管理 软件,用户可以用它方便地组织和安排计划。该 软件短小精悍,仅有一个 数百 KB 的 可执行文件就能完成所有功能,并且 界面设计优秀,初级用户也能够快速上手。

qq_53433382的博客 2014

Angular的服务以及实现数据持久化

1.服务的作用:   用于解决不同组件之间无法像互相调用的问题,放在service中,使得所有组件都可以使用公共的方法。 创建服务的命令 ng g service my-service 创建到指定目录时 ng g service services/storage  1>引入并且配置服务 在app.module.ts中 import {名称} from ‘路...

weixin_30608131的博客 210

【前端】5.Angular实现一个 toDoList 类似京东 App 搜索缓存数据功能【前面知识综合练习】Angular 中的服务以及实现toDoList 数据持久化

参考视频: https://www.bilibili.com/video/av50917863?p=6 https://www.bilibili.com/video/av50917863?p=7 一、Angular的服务 本文中两个例子都用到了数据持久化的方法,为了避免方法重复定义,引入了服务的概念,这是由于: 组件之间没法相互调用各组件里定义的方法; 多个组件都用的方法(例如数据缓存的方法)放...

weixin_43938259的博客 571

Angular--实现ToDoList(事件清单)& 服务实现数据的持久化

ToDoList Angular实现ToDoList(事件清单) 1. 导入双向数据绑定的模块 app.module.ts import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { FormsModule } from '@angular/forms'; // 导入模块 import { AppComponent } from './app.c

天行健 君子以自强不息,地势坤 君子以厚德载物。 684

Angular--实现类似京东App搜索缓存功能实现&服务实现数据的持久化

京东App Angular实现类似京东App搜索缓存功能实现 1. 导入双向数据绑定的模块 app.module.ts import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { FormsModule } from '@angular/forms'; // 导入模块 import { AppComponent } from './app.co

天行健 君子以自强不息,地势坤 君子以厚德载物。 575

angular判断input输入框不能编辑_【Angular】服务和持久化实现

概述官方认为组件不应该直接获取或保存数据, 它们应该聚焦于展示数据,而把数据访问的职责委托给某个服务。而服务就充当着数据访问,逻辑处理的功能。把组件和服务区分开,以提高模块性和复用性。通过把组件中和视图有关的功能与其他类型的处理分离开,可以让组件类更加精简、高效,这是官方的一些定义。非常认同,以我粗鄙的个人开发经验来看,现实开发中并不能完全的把组件和服务区分开来。并没有做到为组件提供专门...

weixin_34326484的博客 561

Angular 学习笔记

Angular 学习笔记

此人很懒,未填写博客简介 2362

angular实现todolist和数据持久化

新建一个Head组件 import { Component, OnInit } from '@angular/core'; import {StorageService} from "../../services/storage.service"; @Component({ selector: 'app-head', templateUrl: './head.component.ht...

dtbk123的博客 470
上一篇: localStorage使用总结
下一篇: Angular学习笔记(六)-Angular操作dom实现侧边栏的显示与隐藏的动画效果
白不懂黑的静
博客等级 码龄16年 93粉丝 306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值