установка позиции для foreignObject в angular

#javascript #angular #svg #binding #foreignobject

#javascript #angular #svg #привязка #foreignobject

Вопрос:

Не удается установить позицию (x, y) для foreignObject в angular

я пробовал так:

 <foreignObject width="65" height="50" x="{{position?.x}}" y="{{position?.y}}">
   <div class="container">works!</div>
</foreignObject>
 

и

 <foreignObject width="65" height="50" [x]="position?.x" [y]="position?.y">
   <div class="container">works!</div>
</foreignObject>
 

но с привязками выдает ошибку:

Невозможно установить свойство x для [объекта SVGForeignObjectElement], который имеет только получатель

и это работает, если я устанавливаю позицию следующим образом:

 <foreignObject width="65" height="50" x="100" y="100">
    <div class="container">works!</div>
</foreignObject>
 

Как я могу установить динамическую позицию для foreignObject?

Ответ №1:

Я нашел решение

Необходимо добавить локальную ссылку на foreignObject

 <foreignObject width="65" height="50" #foreignFirst> <- here
   <div #container class="npz-container">works!</div>
</foreignObject>
 

Затем в ts-файл необходимо добавить ViewChild и атрибут:

 @ViewChild('foreignFirst') foreignFirst: ElementRef;

this.foreignFirst.nativeElement.setAttribute('x', this.position.x);
this.foreignFirst.nativeElement.setAttribute('y', this.position.y);
 

Ответ №2:

Я полагаю, ваш foreignObject имеет входные свойства x и y, которые вы можете установить;

 <foreignObject width="65" height="50" [x]="position.x" [y]="position.y">
   <div class="container">works!</div>
</foreignObject>
 

Вы можете создать объект x в качестве входного свойства в ForeignObject.Component.ts :

 private _position:any;  

@Input()
public get x(){ return position};
    
public set x(position:any){
    this._position=position;
}
 

Комментарии:

1. Спасибо за ваш ответ. Он не работает, выдает ту же ошибку

2. Я отредактировал свой ответ, можете ли вы контролировать это?

3. да, это будет работать в компоненте angular, но foreignObject — это SVG-тег, который вы можете прочитать здесь