【angular】组件:@Input() @Output() 输入属性和输出属性以及中间人模式的使用 (一)

组件

在Angular项目中都是有大大小小的组件组成的,那要怎么样才能做到组件之间的通讯呢,以下有几种方法:


  1. 输入属性:@Input

什么是输入属性:是有父组件发送数据值到子组件里,利用父组件绑定属性到子组件,然后子组件利用在控制器@Input()装饰器来标识这是一个输入变量属性;

父组件:

<p>请输入要传给子组件的值:</p>
<input type="text" [(ngModel)]="b1">
<!-- 在子组件控制器中设置@imput()装饰器来表示要输入的变量;我们需要了解,这是单向的,改变子组件的值不会影响父组件的值-->
<app-c1 [a]="b1"></app-c1>

父组件控制器:

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-home',
  templateUrl: './home.component.html',
  styleUrls: ['./home.component.css']
})
export class HomeComponent implements OnInit {
  b1: number;
  constructor() { }
}

子组件模板:

<div style="border: 1px solid black;margin: 10px 0px 10px 0px">
  <p>
    我是一个子组件
  </p>
  <p>这是一个父组件传过来的值:{{a}} 的数据</p>
</div>

子组件控制器:

import {Component, Input, OnInit} from '@angular/core';

@Component({
  selector: 'app-c1',
  templateUrl: './c1.component.html',
  styleUrls: ['./c1.component.css']
})
export class C1Component implements OnInit {
  @Input()
  a: number;
  constructor() { }

  ngOnInit() {
  }

}
  1. 输出属性:

什么是输出属性:是有子组件向父组件发送数据值,在子组件控制器中使用类型方法:
(EventEmitter)a1: EventEmitter = new EventEmitter();
并且使用 @Output()装饰器来表示 –>

父组件模板:

<h4>输出属性语法:</h4>

<!--在子组件控制器中使用类型方法:
(EventEmitter)a1: EventEmitter<Parin> = new EventEmitter();
并且使用 @Output()装饰器来表示 -->
<!--利用事件绑定来捕获子组件的数据-->
<app-c2 (a1)="c2Fn1($event)"></app-c2>

<p>我在父组件获取子组件发射过来的数据:姓名:{{parin.userName}}
  ,身价:{{parin.maring | number:'2.2-2'}}
</p>

父组件控制器:

import { Component, OnInit } from '@angular/core';
import {Parin} from "../../components/c2/c2.component";

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

  parin: Parin = new Parin('', 0 );
  ngOnInit() {
  }
  c2Fn1(event: Parin) {
    this.parin = event;
  }

}

子组件模板:

<div style="border: 1px solid black;margin: 10px 0px 10px 0px">
  <p>
    我是一个c2子组件
  </p>
  <p>
    我是:{{userName}},身价:{{maring | number:'2.2-2'}}
  </p>
</div>

子组件控制器:

import {Component, EventEmitter, OnInit, Output} from '@angular/core';

@Component({
  selector: 'app-c2',
  templateUrl: './c2.component.html',
  styleUrls: ['./c2.component.css']
})
export class C2Component implements OnInit {
  userName = 'zhangSan';
  maring: number;

  @Output()
  a1: EventEmitter<Parin> = new EventEmitter();
  constructor() {
    setInterval(() => {
      const parin: Parin = new Parin(this.userName, 100 * Math.random());
      this.maring = parin.maring;
      this.a1.emit(parin);
    }, 1000);
  }

  ngOnInit() {
  }

}

export class Parin {
  constructor(
    public userName: string,
    public maring: number
  ) {}
}
  1. 中间人模式:

什么是中间人模式:中间人模式是结合了输入和输出属性的利用同一个父级来协同输入输出,当组件不同属一个父级层则可以用另一种方式,服务来进行操作。

父组件模板:

<h4>中间人模式:</h4>
<!--中间人模式是结合了输入和输出属性的利用同一个父级来协同输入输出,当组件不同属一个父级层则可以用另一种方式,服务来进行操作,-->
<app-c3 (buy)="buyHome($event)"></app-c3>
<app-c4 [parin]="parin1"></app-c4>

父组件控制器:

import { Component, OnInit } from '@angular/core';
import {Parin} from "../../components/c2/c2.component";

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

  parin1: Parin = new Parin('', 0 );
  ngOnInit() {
  }

  buyHome(event: Parin) {
    this.parin1 = event;
  }
}

报价组件模板:

<div style="border: 1px solid black;margin: 10px 0px 10px 0px">
  <p>
    我是一个c3报价子组件
  </p>
  <p>
    我是:{{userName}},身价:{{maring | number:'2.2-2'}}
  </p>
  <input type="button" value="立即买下" (click)="bytoble($event)">
</div>

报价组件控制器:

import {Component, EventEmitter, OnInit, Output} from '@angular/core';

@Component({
  selector: 'app-c3',
  templateUrl: './c3.component.html',
  styleUrls: ['./c3.component.css']
})
export class C3Component implements OnInit {
  userName = 'zhangSan';
  maring: number;

  @Output()
  a1: EventEmitter<Parin> = new EventEmitter();

  @Output()
  buy: EventEmitter<Parin> = new EventEmitter();
  constructor() {
    setInterval(() => {
      const parin: Parin = new Parin(this.userName, 100 * Math.random());
      this.maring = parin.maring;
      this.a1.emit(parin);
    }, 1000);
  }

  ngOnInit() {
  }
  bytoble(event) {
    this.buy.emit(new Parin(this.userName , this.maring));
  }
}

export class Parin {
  constructor(
    public userName: string,
    public maring: number
  ) {}
}

下单组件模板:

<div style="border: 1px solid black;margin: 10px 0px 10px 0px">
  <p>
    我是C4下单子组件
  </p>
  <h6>确定购买:</h6>
  <p>姓名:{{parin.userName}},
  身价:{{parin.maring | number:'2.2-2'}}
  </p>
</div>

下单组件控制器:

import {Component, Input, OnInit} from '@angular/core';
import {Parin} from "../c3/c3.component";

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

  @Input()
  parin: Parin ;
  constructor() { }

  ngOnInit() {
  }

}

angular、spring cloud 开源实战项目源码:https://gitee.com/xfdm/FCat
QQ群:549141844

代码持续更新…

### 倒立摆模糊控制系统实现 MATLAB 仿真 倒立摆系统作为典型的非线性、不稳定控制对象,在控制理论研究工程实践中占据重要地位。为了实现基于模糊控制的倒立摆系统的 MATLAB 仿真,可以从以下几个方面展开: #### 1. 系统建模 倒立摆系统通常由根杆子固定在个可移动的小车上构成。该系统的动态特性可以通过牛顿力学方程描述,得到组非线性的微分方程。这些方程可以表示为状态空间形式以便于后续控制设计。 对于单级倒立摆系统,其主要的状态变量包括小车的位置 \(x\) 速度 \(\dot{x}\),以及摆杆的角度 \(\theta\) 角速度 \(\dot{\theta}\)[^3]。通过合理假设(如忽略摩擦力),可以获得简化后的动力学模型用于仿真实验。 #### 2. 模糊控制器设计 模糊逻辑控制器的核心思想是模仿人类专家的经验决策过程,利用语言变量代替精确数值来进行推理判断。具体到倒立摆系统中,模糊控制器的主要功能是对当前测量到的状态偏差及其变化率作出响应,并据此调整施加给小车的作用力大小与方向。 - **输入定义**: 输入般选取角度误差 (\(e_\theta\)) 及其变化速率 (\(\Delta e_\theta\))[^2]。 - **隶属函数设定**: 需要针对上述两个输入分别构建合适的三角形或梯形分布类型的隶属度曲线。 - **规则库建立**: 结合专业知识或者实验数据制定系列IF-THEN型规则来映射不同组合下的输出动作指令。 例如,“如果\(e_\theta\)较大正向且\(\Delta e_\theta\)较小,则增加推力使车辆远离倾倒侧”。 - **解模糊化方法选择**: 将最终得出的语言值转换回具体的物理量操作命令,常用重心法(COG)完成此步骤[^1]。 #### 3. Simulink 中搭建仿真环境 借助 MATLAB 的图形界面工具箱——Simulink,能够快速便捷地建立起整个闭环反馈体系架构图。主要包括如下模块连接: - 动态植物模型:按照前述所提到的方法编 S 函数表达式导入; - FLC (Fuzzy Logic Controller): 利用内置 FUZZY TOOLBOX 创建自定义模糊推理引擎实例并加载预设参数配置文件; - 数据记录单元:保存每次迭代产生的中间结果方便后期绘图分析比较性能指标差异情况; 以下是简单的 simulink 文件框架示意代码片段: ```matlab % 初始化模糊控制器 fis = readfis('inverted_pendulum_fuzzy_controller'); % 定义S-function回调句柄 sys = []; mdlDerivatives = @(t,x,u,fis) myPendulumDynamics(t,x,u,fis); simset('SrcWorkspace','Current'); [T,X,Y]= sim('InvertedPendulumModel', [],... 'InitialCondition',[0;pi/4;0;0], ... 'OutputOption','Final',... 'RefineFactor',4,... 'RelTol',1e-6); function dxdt=myPendulumDynamics(~,state,input,FIS) % Extract states pos= state(1); vel= state(2); ang= state(3); omega= state(4); % Evaluate fuzzy controller output based on current angle and angular velocity error evalfis(FIS,[ang-pi;omega]); force = ans; % Compute derivatives according to simplified dynamics equations m = ... ; l = ... ; g =... ; temp=(force+m*l*omega^2*sin(ang))/(m*(l*cos(ang))^2+l*m*g*cos(ang)^2-sin(ang)*cos(ang)); dpos_dt =vel; dvel_dt =(temp-l*m*g*sin(ang)-sign(force)*mu)/Meff; dang_dt =omega; domega_dt=-g/l*sin(ang)+c/m/l^2*temp; dxdt=[dpos_dt;dvel_dt;dang_dt;domega_dt]; end ``` 以上脚本展示了如何调用预先训练好的模糊推理系统 `myPendulum.fis` 来实时计算所需的驱动力矩,并将其嵌入至完整的运动学求导公式链路之中形成闭合环路。 #### 4. 性能评估与优化改进措施讨论 运行完毕之后可通过观察波形图表确认各项关键品质要素是否满足预期目标要求,比如稳态精度、上升时间、超调百分比等等。倘若发现存在不足之处则需重新审视原始设计方案是否存在缺陷进而采取相应补救手段加以修正完善直至达到理想效果为止。 --- 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FCAT.TOP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值