• 在组件中定义的信息是固定的,假设另外一个组件也需要用到这些信息,这时候就用到服务,实现 共享数据 和 方法

  • 组件不应该直接获取或保存数据,它们不应该了解是否在展示假数据。 它们应该聚焦于展示数据,而把数据访问的职责委托给某个服务。

  • Service 可以从任何地方获取数据:Web 服务、本地存储(LocalStorage)或一个模拟的数据源

1、创建服务到指定目录下:

  • ng g service services / storage

2、app.module.ts里面引入创建的服务

  • import { StorageService } from '. /service / storage.service';
  • @NgModule里面的providers依赖注入服务 provides:  [ StorageService ] ,

3、使用的页面引入服务、注册服务

  • import { StorageService } from '../. /service / storage.service';
  • private storage : StorageService   注入到构造函数

到这里todolist 组件就可以使用 storage.service 服务里的数据了

例:上节todolist实现的功能(一输入就有数据,更改状态,删除数据);

  现在要实现刷新之后输入的数据还在(增加的数据每次刷新浏览器都还能保存)

每次增加数据的时候可以把数据写入localStorage

 (1)封装localStorage:

  • 将数据写入localStorage           localStorage.setItem
  • setItem不能写入数组或对象,所有要对value值进行转义      JSON.stringify(value)
Storage.Service.ts界面:

export class StorageService {

  constructor() {   /*构造函数*/
}
//将数据写入localStorage
setItem(key,value){
localStorage.setItem(key,JSON.stringify(value))
}

//从localStorage中读取key的值,转换为JSON对象
getItem(key){
return JSON.parse(localStorage.getItem(key));
}
//从localStorage中删除key的值
removeItem(key){
localStorage.removeItem(key);
}

}

(2)在todolist.component组件里面使用localStorage

todolist.component.ts界面:

export class TodolistComponent implements OnInit {

  public username:any='';
public list=[];

//private storage:StorageService  依赖注入服务
constructor(private storage:StorageService) { console.log(this.storage); // this.storage.setItem('username','张三'); // alert(this.storage.getItem('username'));
}


  ngOnInit() {

      //每次刷新获取storage里面 todolist的值

      var todolist=this.storage.getItem('todolist');
if(todolist){
this.list=todolist;
} }


addData(e)
{ //1.从storage获取 todolist的数据 //2.如果有数据,拿到这个数据,然后把新数据和这个storage数据拼接,重新写入 //3.如果没有数据 直接给storage写入数据 if(e.keyCode==13){ var obj={ /*每次增加的一个对象数据*/
username:this.username,
status:1
}
      //1.从storage获取todolist的数据
var todolist=this.storage.getItem('todolist');
      //2.如果有数据,拿到这个数据,然后又把新数据和这个storage数据拼接,重新写入
      if(todolist){
todolist.push(obj);
this.storage.setItem('todolist',todolist);

      //3.如果没有数据 直接给storage写入数据
}else{
var arr=[];
arr.push(obj);
this.storage.setItem('todolist',arr);
} this.list.push(obj);
this.username='';
} // console.log(e);
}


deleteData(key
){ // alert(key); this.list.splice(key,1); /*删除数组的数据*/
}


changeData(key,status)
{ /*改变状态*/ this.list[key].status=status; this.storage.setItem('todolist',this.list);
}
}
<h2>正在进行</h2>
<ul>
<li *ngFor="let item of list;let i =index;" [hidden]="item.status==2">
<button (click)="changeData(i,2)">改变数据</button>{{item.status}}-- {{item.username}}------- <button (click)="deleteData(i)">删除-</button>
</li>
</ul> <h2>已经完成</h2>
<ul>
<li *ngFor="let item of list;let i =index;" [hidden]="item.status==1">
<button (click)="changeData(i,1)">改变数据</button>{{item.status}}-- {{item.username}}------- <button (click)="deleteData(i)">删除-</button>
</li>
</ul> 

angularcli 第七篇(service 服务)的更多相关文章

  1. 淘宝(阿里百川)手机客户端开发日记第七篇 Service,Handler和Thread

    现在我们已经已经知道android有Service,Handler和Thread这些内容了,但是我想应该还有很多人对此并不是很清楚他们之间的区别! (1)Service 是运行在后端的程序,不与UI直 ...

  2. Spring Cloud第七篇 | 声明式服务调用Feign

    本文是Spring Cloud专栏的第七篇文章,了解前六篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Cloud ...

  3. 【K8S】Service服务详解,看这一篇就够了!!

    k8s用命名空间namespace把资源进行隔离,默认情况下,相同的命名空间里的服务可以相互通讯,反之进行隔离. 1.1 Service Kubernetes中一个应用服务会有一个或多个实例(Pod, ...

  4. [老老实实学WCF] 第七篇 会话

    老老实实学WCF 第七篇 会话 通过前几篇的学习,我们已经掌握了WCF的最基本的编程模型,我们已经可以写出完整的通信了.从这篇开始我们要深入地了解这个模型的高级特性,这些特性用来保证我们的程序运行的高 ...

  5. 跟我学SpringCloud | 第三篇:服务的提供与Feign调用

    跟我学SpringCloud | 第三篇:服务的提供与Feign调用 上一篇,我们介绍了注册中心的搭建,包括集群环境吓注册中心的搭建,这篇文章介绍一下如何使用注册中心,创建一个服务的提供者,使用一个简 ...

  6. 第七篇 SQL Server代理作业活动监视器

    本篇文章是SQL Server代理系列的第七篇,详细内容请参考原文 在这一系列的上一篇,你创建并配置SQL Server代理作业.每个作业有一个或多个步骤,可能包含大量的工作流.在这篇文章中,将查看作 ...

  7. [开发笔记]-控制Windows Service服务运行

    用代码实现动态控制Service服务运行状态. 效果图: 代码: #region 启动服务 /// <summary> /// 启动服务 /// </summary> /// ...

  8. C# Windows Service服务的创建和调试

    前言 关于Windows服务创建和调试的文章在网络上的很多文章里面都有,直接拿过来贴在这里也不过仅仅是个记录,不会让人加深印象.所以本着能够更深刻了解服务项目的创建和调试过程及方法的目的,有了这篇记录 ...

  9. Linux下用gSOAP开发Web Service服务端和客户端程序

    网上本有一篇流传甚广的C版本的,我参考来实现,发现有不少问题,现在根据自己的开发经验将其修改,使用无误:另外,补充同样功能的C++版本,我想这个应该更有用,因为能用C++,当然好过受限于C. 1.gS ...

随机推荐

  1. Oracle中使用Table()函数解决For循环中不写成 in (l_idlist)形式的问题

    转: Oracle中使用Table()函数解决For循环中不写成 in (l_idlist)形式的问题 在实际PL/SQL编程中,我们要对动态取出来的一组数据,进行For循环处理,其基本程序逻辑为: ...

  2. windows中设置php环境变量

    1.我的电脑->右键(选择我的属性) 2.点击高级设置 3.点击环境变量 4.在系统变量中找到Path 点击 5.找到php.exe的文件目录,添加到path中 6.php -v 显示版本,表示 ...

  3. python初级(302) 6 对象(二)

    一.复习 1.什么是对象 2.什么是类 3.什么是属性 4.什么是方法 5.创建一个dog类,dog的属性有颜色,方法有汪汪叫 随堂练习: class Dog: def __init__(self, ...

  4. Java实现 微信小程序 + 消息推送

    实现效果: 下面要显示五个字段 接下来,参照官方文档,一步步实现: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open- ...

  5. VMware设置桥接模式(使虚拟机拥有独立IP访问外网)

    1.关闭虚拟机里的系统 2.VMware主窗口 编辑---->虚拟网络编辑器 右下角----> 更改设置---->出现  桥接模式 桥接到:看本机所连接的网络, 网络属性中有一项“描 ...

  6. LODOP表格水平居中3(宽度为百分比)

    如果一个表格在css样式等中设置了固定的宽度,想要实现表格在纸张中水平居中,可根据固定的宽度设置合适的左边距,如果打印项内容在打印项宽度中居中,可以设置打印项在纸张中居中.方法1:宽度固定,纸张大小固 ...

  7. ANR无法生成traces.txt文件

    在有些设备上ANR无法生成traces.txt文件,kill -3又不能准确把握时机或者没权限,可能是软件访问这个路径失败,可以在/data/anr/下面建立一个空的traces.txt,注意保证an ...

  8. unity 在editor编辑器下创建多个按钮

    入坑最后发现就几句话,真是气死人了.发现自己掉坑里,脑子就变笨了,把代码贴给你们,保持大脑清醒. using System.Collections; using System.Collections. ...

  9. SpringBoot集成Mybatis实现多表查询的两种方式(基于xml)

     下面将在用户和账户进行一对一查询的基础上进行介绍SpringBoot集成Mybatis实现多表查询的基于xml的两种方式.   首先我们先创建两个数据库表,分别是user用户表和account账户表 ...

  10. Visual Studio Code (vscode) 配置 C / C++ 环境

    Visual Studio Code (vscode) 配置 C / C++ 环境 昨天突发奇想,想使用vscode配置C++环境,因为不想下载 Dev OR codeblock,然后借助了很多网上教 ...