input和output哪个是充电_Angular2中Input和Output用法及示例

Input相当于指令的值绑定,无论是单向的(@)还是双向的(=)。丢失将父作用域的值“输入”到子作用域中, 然后子作用域进行相关处理。

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

看个angular2示例吧,我们自定义一个numberInput component,获取父作用域的值或者属性,然后在鼠标离开的时候调用父组件的方法验证

f8acc2e2af5ba2f05c539e1ee3721043.png

import {

Component, Input, Output, OnInit, ExistingProvider, forwardRef,

AfterViewInit, ElementRef, ViewChild, ViewContainerRef, ChangeDetectorRef, Optional, EventEmitter

} from'@angular/core'import {

NgModel, ControlValueAccessor, NG_VALUE_ACCESSOR, NgForm, FormControl,

ValidatorFn, ValidationErrors

} from'@angular/forms'import { InputBase, existingProvider } from'../../inputBase'import { Observable } from'rxjs'declarevar$: any;

@Component({

selector:'cm-number',

templateUrl:'numberInput.component.html',

styleUrls: ["./numberInput.component.css"],

providers: [existingProvider(NumericInputComponent)]

})

export class NumericInputComponent extends InputBase implements OnInit {

@ViewChild("input")

input: ElementRef;

ngOnInit() {

Observable.merge(

Observable.fromEvent(this.input.nativeElement, "input"),

Observable.fromEvent(this.input.nativeElement, "blur"),

Observable.fromEvent(this.input.nativeElement, "change")

).subscribe(e=>{

e.stopPropagation();

e.stopImmediatePropagation();

let p=e.target as HTMLInputElement;

let val= this.format(p.value);if (val !==p.value) {

p.value=val;

}if (val != this.model.value) {if (val == undefined || val.trim() === "") {this.onChange(undefined);

}else{this.onChange(parseFloat(val));

}

}

});if (this.model != null) {var fn: ValidatorFn = (c) =>{var errors: ValidationErrors ={};if ((this.hasEqualOperatorForMin && parseFloat(this.internalValue) < parseFloat(this.min.toString()))|| (!this.hasEqualOperatorForMin && parseFloat(this.internalValue) <= parseFloat(this.min.toString()))|| parseFloat(this.internalValue) > parseFloat(this.max.toString())) {

errors.dose= true;

}returnerrors;

}this.model.control.setValidators(fn);

}

}

private get internalValue() {

let val= (this.input.nativeElement).value;if (!val) returnundefined;

val=val.trim();if (val == "") returnundefined;returnval;

}

private format(val: string) {while (true) {

let newVal= val.replace(/[^0-9.-]/g, '');if (this.allowFloat) {

newVal= newVal.replace(/(\..*)\./g, '$1');

}else{

newVal= newVal.replace(/(.*)\./g, '$1');

}if (!this.allowNegative) {

newVal= newVal.replace(/-/g, '');

}else{

newVal= newVal.replace(/^-(-.*)/g, '$1');

newVal= newVal.replace(/(.+)-/g, '$1');

}

newVal= newVal.replace(/^0+([0-9].*)/g, '$1');

newVal= newVal.replace(/^0+(0\..*)/g, '$1');if (newVal === val) break;

val=newVal;

}returnval;

}

public _value: string;

@Input() maxlength: number;

@Input() readonly:boolean = false;

@Input() allowFloat:boolean = true;

@Input() min: number= 0;

@Input() max: number= 99999;@Input()

public get value() {return this._value;

}

public set value(val: string) {this._value =val;if (val == undefined || val.trim() == "") {this.onChange(undefined);

}else{this.onChange(parseFloat(this._value));

}

}

public writeValue(obj: any) {

obj= obj == undefined ? "": obj;

(this.input.nativeElement as HTMLInputElement).value =obj;

}

@Output()

public onblur: EventEmitter = new EventEmitter();

blur(e: Event) {this.onblur.emit($(e.target).val());

}

}

就举一个例子:

78388fca49b3a3def260c729af543248.png

我们在父作用域中使用的时候, 可以这样赋值:

31b45a351f481d723a96651c348b0f12.png

其实number input component 中, 我们会根据 allowFloat 的值,来决定是否允许输入小数。

e758552ec98ce5eae909e0ca81fd537f.png

ok, 以上是Input的示例。

Output一般都是一个EventEmitter的实例,使用实例的emit方法将参数emit到父组件中,触发父组件的事件。

然后父组件监听到该事件的发生,执行对应的处理函数。

25717f6cd76042a3242093d30eaf4c5d.png

这里之所以要自定义一次 blur  事件(EventEmitter), 是因为在 ngOnInit()中已经对blur 事件做过处理,这样父控件中就会被阻止掉,如果父控件中要用到blur 事件的话, 就可以用这种方式来做,我们自定义一个叫onBlur 的事件,然后在父控件中去实现内部逻辑。

是不是很简单啊。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Angular的@Input和@Output是用来实现组件之间通信的注解。 @Input用来接收父组件传递过来的数据,而@Output则用来向父组件传递数据。 下面是它们的使用方法: 1. @Input 在子组件使用@Input注解来接收父组件传递的数据。例如: ``` import { Component, Input } from '@angular/core'; @Component({ selector: 'child-component', template: ` <div>{{data}}</div> ` }) export class ChildComponent { @Input() data: string; } ``` 在父组件使用属性绑定的方式将数据传递给子组件。例如: ``` import { Component } from '@angular/core'; @Component({ selector: 'parent-component', template: ` <child-component [data]="myData"></child-component> ` }) export class ParentComponent { myData = 'Hello world'; } ``` 2. @Output 在子组件使用@Output注解来定义一个事件。例如: ``` import { Component, Output, EventEmitter } from '@angular/core'; @Component({ selector: 'child-component', template: ` <button (click)="onClick()">Click me</button> ` }) export class ChildComponent { @Output() clicked = new EventEmitter<void>(); onClick() { this.clicked.emit(); } } ``` 在父组件使用事件绑定的方式监听子组件的事件。例如: ``` import { Component } from '@angular/core'; @Component({ selector: 'parent-component', template: ` <child-component (clicked)="onChildClicked()"></child-component> ` }) export class ParentComponent { onChildClicked() { console.log('Child component clicked'); } } ``` 这样就实现了子组件向父组件传递数据的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值