@input 与@output 的初步理解

@input是用来定义输入的,是接收其他组件传过来的数据的。相当于指令的值绑定,无论是单向的(@)还是双向的(=)。都是将父作用域的值“输入”到子作用域中,然后子作用域进行相关处理。我这个是在写一个地址选择框时的一个公用的组建。

export class InputData {
        province:number;
        city:number;
        area:number;
	town:number;
	address:string;
}

@output相当于指令的方法绑定,子作用域触发事件执行响应函数,而响应函数方法体则位于父作用域中,相当于将事件“输出到”父作用域中,在父作用域中处理。

 @Input() data:InputData;
  @Output() areaemit = new EventEmitter<any>();

 这是我的输入输出的格式然后areaemit是我的处理输出的名字

export class AddressInfo {
	provinceId:number;
	//provinceName:string;
	cityId:number;
	//cityName:string;
	areaId:number;
	//areaName:string;
	townId:number;
	//townName:string;
}

  这是定义的输出类里面的四个参数

/**
	*  获取地址Id
    *  @param level 1是省,2是市,3是区,4是镇
	* 
	*/
	public getArea(level:number){
		let areaId:number = 0;
		switch(level){
			case 2: 
				areaId =this.data.province;
				this.selectAddressInfo.provinceId = areaId;
				
				break;
			case 3:
			    areaId  = this.data.city;
				this.selectAddressInfo.cityId = areaId;
				break;
			case 4:
				areaId =this.data.area;
				this.selectAddressInfo.areaId = areaId;
			break;
			case 5:
				areaId =this.data.town;
				this.selectAddressInfo.townId = areaId;
				  
			break;
		}

		this.checkAllSelect();		//如果全部选择了,通知父组件

		this.manageService.getArea(areaId).subscribe(
			res =>{
				if(res['errorCode'] == "0"){
					switch(level){
                        case 1:		//省
							this.provinceList = res['data']['areaInfo'];
						
							if(this.data.province > 0){
								
								this.getArea(2);
							}
							break;
						case 2:		//市
							this.cityList = res['data']['areaInfo'];
							
							
								this.getArea(3);
							
							break;
						case 3:   //区
							this.areaList = res['data']['areaInfo'];
						
							if(this.data.area > 0){
								this.getArea(4);
							}
							break;
						case 4:	 //镇
							this.townList = res['data']['areaInfo'];
				
							if( this.data.province >4 && this.data.province<33){
								this.getArea(5);
							}
							break;

					}
				}else if(res['errorCode'] == "-10000005"){
				}else if(res['errorCode'] == "-20000001"){
					//goToLogin(this.router);
				}else{
					this.toptipsService.warn(res['msg'] + ":" + res['errorCode'])
				}
			},
			error => {
				this.toptipsService.warn("服务器出现错误,请稍后重试!")
			},
			() => {
				
			}
		);
	}

	public checkAllSelect(){
		if(this.selectAddressInfo.provinceId > 0 && this.selectAddressInfo.cityId > 0&&this.selectAddressInfo.townId>0){
			this.areaemit.emit(this.selectAddressInfo);
		}
	}

  在一个检查选择的方法里面把他弹出了。还有前面选择的时候的赋值。这是子组件里面的一部分内容。

然后就是在父组件里面传入.父组件模版的内容

  <app-area [data] = "data.userInfo" (areaemit) = "updateArea($event)"></app-area>

  然后这里做了传出数据赋值

	public updateArea(selectAddress:AddressInfo){
		 selectAddress.provinceId = this.data.userInfo.province;
		 selectAddress.areaId = this.data.userInfo.area;
		 selectAddress.cityId = this.data.userInfo.city;
		 selectAddress.townId = this.data.userInfo.town;
	}

  不过要引入子组件的类

import { AddressInfo } from '../../../../utils/area/area.component'

声明: 这是我刚学Angularjs 然后有很多不足希望大神来指点。

1.我也有很多疑问为什么我不用output输出也能接收到数据啊。(我认为是数据的双向绑定吗)

2.其实我感觉里面代码中也有很多不用的。

 

转载于:https://www.cnblogs.com/zglll/p/7810099.html

<think>嗯,用户现在遇到了Linux系统运行一段时间后,远程执行命令出现Input/Output错误的问题。首先,我需要理解这个问题的可能原因。Input/Output错误通常硬件或文件系统相关,可能涉及磁盘、内存、网络存储等方面。 用户提到系统运行一段时间后才出现这个问题,这可能意味着问题资源耗尽、硬件故障逐渐显现,或者某些服务在长时间运行后出现异常有关。我需要考虑几个方面: 1. **磁盘健康状态**:硬盘或SSD可能有坏道或损坏,导致读取或入失败。使用smartctl检查磁盘的SMART状态是个好方法。 2. **文件系统错误**:文件系统损坏可能导致I/O错误。需要运行fsck来检查和修复。 3. **内存问题**:坏内存可能导致数据传输错误,尤其是在使用磁盘缓存时。memtest86+可以检测内存问题。 4. **网络存储问题**:如果使用NFS或iSCSI等远程存储,网络不稳定或存储服务器问题可能引发I/O错误。 5. **内核或驱动程序问题**:过时的驱动或内核bug可能导致硬件通信失败。 6. **系统日志分析**:查看/var/log/syslog或dmesg的输出,寻找具体的错误信息。 7. **资源耗尽**:如inode或磁盘空间不足,也可能导致I/O错误,虽然通常会有不同的报错,但也不能完全排除。 接下来需要一步步引导用户排查。首先建议检查磁盘健康,然后是文件系统,接着是内存,再查看日志。如果这些都没问题,再考虑网络存储或内核问题。同时,询问用户是否在问题出现前有系统变更,如更新或新硬件添加,这可能提供额外线索。 另外,用户之前询问过鞋盒高度的问题,现在转向Linux系统问题,可能用户是IT相关工作者,或是爱好者,需要技术支持。用户可能对技术细节有一定了解,但需要明确的步骤指导。回答时要结构清晰,分点列出可能原因和解决方法,同时提醒备份重要数据,避免数据丢失。</think>当Linux系统运行一段时间后出现 **Input/Output error(I/O错误)**,通常硬件、文件系统或存储驱动相关。以下是逐步排查解决方案: --- ### 一、初步定位问题 1. **查看错误日志** 通过命令快速获取关键信息: ```bash dmesg | grep -i error # 检查内核日志中的I/O报错 journalctl -p 3 -b # 查看系统启动后的严重错误日志 ``` - 若日志中明确提到 **`sdX: I/O error`**(如sda/sdb),则可能为磁盘故障。 2. **确认错误范围** - 错误是否仅出现在**特定文件**或**目录**? - 是否仅在访问**远程存储**(如NFS、iSCSI)时发生? --- ### 二、硬件存储排查 #### 1. **检查磁盘健康状态** - 使用SMART工具检测硬盘/SSD: ```bash sudo smartctl -a /dev/sdX # 替换sdX为实际磁盘标识(如sda) ``` - 关注 **`Reallocated_Sector_Ct`(重定位扇区数)** 和 **`UDMA_CRC_Error_Count`(传输校验错误)**,若数值持续增长,表明磁盘老化或损坏。 #### 2. **检测文件系统错误** - 卸载问题磁盘后修复(**谨慎操作,先备份数据**): ```bash sudo umount /dev/sdX # 卸载磁盘 sudo fsck -y /dev/sdX # 自动修复文件系统 ``` #### 3. **检查内存问题** - 内存故障可能导致缓存数据错误,间接引发I/O报错: ```bash sudo memtester 4G 1 # 测试4GB内存(需安装memtester) ``` --- ### 三、网络远程存储问题 #### 1. **NFS/iSCSI连接稳定性** - 若错误出现在远程挂载存储: ```bash sudo mount -o remount /mnt # 尝试重新挂载 ping <存储服务器IP> # 检查网络延迟和丢包 ``` #### 2. **检查存储服务状态** - 登录存储服务器,验证服务是否正常: ```bash systemctl status nfs-server # 查看NFS服务状态 ``` --- ### 四、系统驱动层排查 1. **更新内核驱动** 过期的驱动可能导致兼容性问题: ```bash sudo apt update && sudo apt upgrade # Debian/Ubuntu sudo dnf update # Fedora/CentOS ``` 2. **检查块设备参数** 调整磁盘调度策略(如机械硬盘用**deadline**,SSD用**noop**): ```bash echo deadline | sudo tee /sys/block/sdX/queue/scheduler ``` --- ### 五、高级诊断 1. **使用`strace`追踪系统调用** 定位具体I/O操作失败点: ```bash strace -e trace=read,write <故障命令> ``` 2. **测试裸设备读** 绕过文件系统直接测试磁盘: ```bash sudo dd if=/dev/sdX of=/dev/null bs=1M count=1000 iflag=direct ``` - 若`dd`命令报错,则硬件故障概率极高。 --- ### 六、临时缓解措施 - 重启系统以释放内核I/O缓存: ```bash sync; echo 3 | sudo tee /proc/sys/vm/drop_caches ``` - 若为硬盘故障,立即备份数据并更换磁盘! --- ### 总结建议 | 故障概率排名 | 可能原因 | 行动建议 | |--------------|-------------------------|------------------------------| | 1 | 磁盘物理损坏/坏道 | 备份数据,更换硬盘 | | 2 | 文件系统损坏 | 运行`fsck`修复 | | 3 | 网络存储连接异常 | 检查网络和服务端状态 | | 4 | 内存/驱动问题 | 更新驱动,内存测试 | **注意**:若问题复现频繁,建议优先联系硬件厂商或系统管理员深度检测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值