Моя цель состоит в том, чтобы иметь холст SVG
в шаблоне Angular 2, который масштабируется с его родительским элементом и вызывает метод перерисовывания при изменении его размера.Capture SVG onresize in Angular2
Используя onresize
собственность, я получаю события, как ожидалось, но я не могу назвать метод компонента:
<svg width="100%" height="100%" id="canvas" onresize="console.log('resize')">
</svg>
Когда я использую правильный синтаксис Угловое 2, я могу вызвать метод, но событие никогда не стрелял:
<svg width="100%" height="100%" id="canvas" (resize)="resize()">
</svg>
Чтобы проверить логику, я изменил (resize)
в (click)
, а затем события запускаются, когда я нажимаю на холсте.
Поскольку это не сработало для меня, я пробовал другие способы прикрепить событие onresize
.
Сначала я добавил #canvas
к svg
тегу:
<svg width="100%" height="100%" #canvas id="canvas">
</svg>
Затем я добавил ViewChild
к компоненту.
@ViewChild('chart') canvas : ElementRef;
Я пробовал каждый метод, как описано здесь: SVGResize | onresize event
function handler() { console.log('SVG resize') }
this.canvas.nativeElement.onresize = handler;
this.canvas.nativeElement.attachEvent("onresize", handler);
this.canvas.nativeElement.addEventListener("SVGResize", handler);
Ни один из них не стрелять каких-либо событий. Единственный способом до сих пор, как я могу захватить изменения размера является установка обработчика событий на уровне документа:
window.addEventListener('resize',() => {
this.draw();
});
Поэтому, когда страница изменяет я могу вызвать перерисовку SVG. Это, однако, несколько недостатков. Во-первых, SVG
не всегда изменяет размер при изменении размера документа. Во-вторых, SVG также может изменять размеры в других ситуациях, когда страница остается того же размера. Я могу обойти их, но это не так уж и элегантно и подвержено ошибкам. Было бы намного лучше справиться с изменением размера на SVG напрямую.
Как только у меня будет время, я собираюсь сделать Плункер. Я провел тесты с помощью Chrome и Firefox.
Почему не работает вывод (resize)
и как я могу правильно обрабатывать события изменения размера холста?
Единственный способ захватить события изменения размера непосредственно на SVG - это использовать атрибут onresize
. Есть ли способ вызывать методы Компонента оттуда?
Вы можете попробовать '(SVGResize) =" resize() "' https://developer.mozilla.org/en-US/docs/Web/Events/SVGResize –
Я попробовал, и это не сработало для меня , Размер элемента не изменяется, и, похоже, его также нет в элементах SVG. Кажется, что SVG просто излучает одно и то же событие, которое выдает документ. (The Plunker я играл с https://plnkr.co/edit/ZGFtvmQHEGZSizvXTgdU?p=preview) –
Спасибо, что сделал Plunker. Сделав больше тестов самостоятельно, я думаю, что это невозможно с событием непосредственно на SVG. Я нашел [css-element-queries] (http: //marcj.github.io/css-element-queries /), который кажется многообещающей альтернативой. Я еще не пробовал это, так как теперь я доволен некоторыми другими вещами. – barney765