Ответ «нет». В вашем примере значение, которое вы передаете свойству @Input
, является ссылкой на объект. Если бы у вас была двусторонняя привязка, вы могли бы назначить новый объект этому свойству в дочернем компоненте:
this.thing = { name: "world", nbm: 10 };
и соответствующее свойство в родительском компоненте будет соответствующим образом обновлено. Это не так, как вы можете видеть в этом стеке бликов .
Однако, поскольку родительский и дочерний компоненты имеют ссылку на один и тот же объект, они оба могут изменять одно из его свойств, и это изменение будет наблюдаться в другом компоненте.
<Ч />
Чтобы реализовать двустороннюю привязку, вы можете добавить свойство @Output
с тем же именем, за которым следует Change
, и выдать событие, когда произойдет изменение:
@Input() thing: any;
@Output() thingChange = new EventEmitter();
setNewObject(){
this.thing = { name: "world", nmb: 10 };
this.thingChange.emit(this.thing);
}
Изменение будет отражено в родительском компоненте, если используется синтаксис двустороннего связывания:
<child2 [(thing)]="thing"></child2>
См. этот стек для демонстрации.
<Ч />
Если вы хотите запретить дочернему компоненту изменять исходный объект, вам следует привязать свойства объекта вместо самого объекта:
@Input() thingName: string;
@Input() thingNmb: number;
<child [thingName]="thing.name" [thingNmb]="thing.nmb"></child>