Angular - 两种方式将输入 属性 绑定到具有 getters / setters 的组件
Angular - Two way binding input property to component with getters / setters
我有以下 angular 个组件:
ComponentB
有输入 属性,componentA
在模板文件中插入 componentB
。
代码如下所示:
componentA.ts:
export class ComponentA{
isOpen: boolean;
methodA() {
this.isOpen = false;
// do some work
}
}
componentA.html:
<componentB [(open)]="isOpen"></componentB >
ComponentB.ts:
@Component({
selector: 'componentB',
templateUrl: 'ComponentB .html',
encapsulation: ViewEncapsulation.None,
})
export class ComponentB {
private _open: boolean = false;
@Input('open') set open(value: boolean) {
if (open === this._open) {
return;
}
if (open) {
// doSomething()
} else {
// doSomethingElse()
}
this._open = open;
}
get open() {
return this._open;
}
}
问题是 isOpen
属性 似乎没有反映 open
属性 的当前值,尽管指定了双向绑定。
为什么会这样?
如何解决?
private _open= false;
@Input('open') set open(value: boolean) {
if (value=== this._open) {
return;
}
if (value) {
// doSomething()
} else {
// doSomethingElse()
}
this._open = value;
}
get open() {
return this._open;
}
你能试试这个吗?
顺便说一下@Input() 打开:布尔值 = false;是一个 lint 错误。当您将 = false 分配给值时,它的类型将自动分配为布尔值,您不必指定它
双向绑定是angular提供的一种特殊语法,用于设置组件的值和监听值的变化同时
For this purpose special syntax (Banana in a box) "[()]" is used. Please find the official angular documentation about this here.
简而言之,您必须提供一个 属性 和 @Input() 装饰器,以及一个 属性 和 @Output() 装饰器。 @Output() 属性 将附加单词 Change。因此,如果@Input 属性 名称为 x,则输出 属性 名称应为 xChange。每当底层绑定 属性 发生更改时,使用输出 属性 的 EventEmitter,让父组件监听更改(因此实现了双向绑定) .
在您的情况下,您的代码将像这样更新
@Input('open') set open(value: boolean) {
if (value === this._open) {
return;
}
if (open) {
// doSomething()
} else {
// doSomethingElse()
}
this._open = value;
this.openChange.emit(this._open); //open value set, the updated value is emitted using the output property.
}
get open() {
return this._open;
}
@Output('openChange') //the output property added
openChange = new EventEmitter<boolean>();
请找到 Stack Blitz link.
我有以下 angular 个组件:
ComponentB
有输入 属性,componentA
在模板文件中插入 componentB
。
代码如下所示:
componentA.ts:
export class ComponentA{
isOpen: boolean;
methodA() {
this.isOpen = false;
// do some work
}
}
componentA.html:
<componentB [(open)]="isOpen"></componentB >
ComponentB.ts:
@Component({
selector: 'componentB',
templateUrl: 'ComponentB .html',
encapsulation: ViewEncapsulation.None,
})
export class ComponentB {
private _open: boolean = false;
@Input('open') set open(value: boolean) {
if (open === this._open) {
return;
}
if (open) {
// doSomething()
} else {
// doSomethingElse()
}
this._open = open;
}
get open() {
return this._open;
}
}
问题是 isOpen
属性 似乎没有反映 open
属性 的当前值,尽管指定了双向绑定。
为什么会这样? 如何解决?
private _open= false;
@Input('open') set open(value: boolean) {
if (value=== this._open) {
return;
}
if (value) {
// doSomething()
} else {
// doSomethingElse()
}
this._open = value;
}
get open() {
return this._open;
}
你能试试这个吗?
顺便说一下@Input() 打开:布尔值 = false;是一个 lint 错误。当您将 = false 分配给值时,它的类型将自动分配为布尔值,您不必指定它
双向绑定是angular提供的一种特殊语法,用于设置组件的值和监听值的变化同时
For this purpose special syntax (Banana in a box) "[()]" is used. Please find the official angular documentation about this here.
简而言之,您必须提供一个 属性 和 @Input() 装饰器,以及一个 属性 和 @Output() 装饰器。 @Output() 属性 将附加单词 Change。因此,如果@Input 属性 名称为 x,则输出 属性 名称应为 xChange。每当底层绑定 属性 发生更改时,使用输出 属性 的 EventEmitter,让父组件监听更改(因此实现了双向绑定) .
在您的情况下,您的代码将像这样更新
@Input('open') set open(value: boolean) {
if (value === this._open) {
return;
}
if (open) {
// doSomething()
} else {
// doSomethingElse()
}
this._open = value;
this.openChange.emit(this._open); //open value set, the updated value is emitted using the output property.
}
get open() {
return this._open;
}
@Output('openChange') //the output property added
openChange = new EventEmitter<boolean>();
请找到 Stack Blitz link.