3

来自 Victor Savkin 关于Angular2 模板语法的帖子,展示了如何使用输入和输出属性绑定 -

<todo-cmp [model]="todo" (complete)="onCompletingTodo(todo)"></todo-cmp>

@Component({selector: 'todo-cmp'})
class TodoCmp {
  @Input() model;
  @Output() complete = new EventEmitter(); // TypeScript supports initializing fields
}

输入属性用@Input() 修饰,而输出属性用@Output() 修饰。我应该如何声明一个将具有 2 路属性绑定的属性?示例:假设 rootpanel 组件具有 'suggestions' 属性(字符串类型)并且 searchPanel 具有 'getSuggestions 属性。现在我希望这两个属性以两种方式相互绑定。我试过 -

根面板.html:

<search-panel [(getSuggestions)]="suggestions"> </search-panel>

但是我在 searchPanel 组件中声明 getSuggestions 属性时被卡住了。getSuggestions 属性的类型应该是什么string or EventEmitter<string>

请建议。

4

3 回答 3

4

如果您想从父组件进行双向模型绑定:

[(model)]

您的子组件中需要以下内容:

@Input() model: string;
@Output() modelChange:EventEmitter<string>;

在某个时候,当模型在您的子组件中被覆盖时,您将发出modelChange事件:

updateModel(newValue:string) {
    this.model = newValue;
    this.modelChange.emit(this.model);
}

从父组件的角度来看,[(model)]相当于:

[model]="model"  (modelChange)="model=$event"

这样,当模型属性在子组件内部发生变化时,模型中的变化通过双向绑定向上传播,沿途同步所有绑定的模型。

于 2016-01-15T11:16:10.417 回答
2

如果您想使用[(getSuggestions)]-style 进行双向绑定,请声明如下字段

class TodoCmp {
  @Input() getSuggestions;
  @Output() getSuggestionsChange = new EventEmitter(); 

  onClick() {
    getSuggestions = 'someValue';
    getSuggestionsChange.emit(getSuggestions);
  }
}

getSuggestions对于这样的输入/输出组合可能不是一个好的选择,但它应该展示它们是如何连接的。输出需要与输入具有相同的名称,并带有附加的Change. 如果此命名方案不适合使用您的组件,例如

<search-panel [suggestions]="suggestions" (getSuggestions)="updateSuggestions($event)> </search-panel>

输入/输出如

class TodoCmp {
  @Input() suggestions;
  @Output() getSuggestions = new EventEmitter(); 

  onClick() {
    suggestions = 'someValue';
    getSuggestions.emit(getSuggestions);
  }
}
于 2016-01-15T11:17:06.890 回答
0

pixelbits 推荐的方法正是您应该这样做,但如果您在一个组件上有多个双向数据绑定属性,或者甚至在您的代码库中经常更改的属性,我为此创建了一个装饰器。如果你在这里使用 npm 。如果您需要代码,只需转到 gihub 页面即可。

有了这个,你可以直接使用:

import { Component } from '@angular/core';
import { TwoWay } from 'two-way-decorator';
 
@Component({
  selector: 'app-example',
  templateUrl: './example.component.html',
  styleUrls: ['./example.component.scss']
})
export class ExampleComponent {
 
  @TwoWay()
  public text: string;
 
  @TwoWay()
  public count: number;
 
}

于 2020-02-28T14:45:16.240 回答