【问题标题】:Aurelia: resize/layout change event for view?Aurelia:调整视图的大小/布局更改事件?
【发布时间】:2016-03-11 09:55:44
【问题描述】:

有没有办法订阅视图以观察 Aurelia 中的调整大小/布局事件?我有一个想要调整大小的画布。我想知道是否有“aurelia”方式来做到这一点?

我试过了:

<div ref="canvasContainer" class="widget-dial-container" resize.delegate="doresize()">
  <canvas ref="canvas" class="widget-dial-canvas" />
</div>

但它从不调用我的doresize() 方法。

我尝试绑定到 DOM offsetWidth 和 offsetHeight,但这也不起作用(在 vm 中有和没有 @bindable canvasContainer;

【问题讨论】:

  • 你不能在 div 上使用 resize 事件
  • 这就是为什么我要问 aurelia 是否想出了一个办法。

标签: javascript canvas aurelia


【解决方案1】:

正如 Kruga 所说,resize 事件仅在 window 本身上受支持。您可以使用 Aurelia 平台抽象层的 PLATFORM 对象以跨平台方式附加到它。您必须运行 jspm install aurelia-pal 才能获得它。如果您不担心跨平台,那么您可以使用window 对象。

以下模板和 VM 适合我。我在调整大小计时器上实现了一个节流阀:

HTML

<template>
  <div style="height: 125px; min-width: 150px; width: 100%;" ref="canvasContainer">
    <canvas ref="canvas" width.one-way="canvasContainer.offsetWidth"></canvas>
  </div>
</template>

模板

import {PLATFORM} from 'aurelia-pal';

export class App {
  resizeTimer = null;
  resizeEventHandler = () => this.resized();

  attached() {
    this.resized();

    PLATFORM.global.addEventListener("resize", this.resizeEventHandler);
  }

  detached() {
    PLATFORM.global.removeEventListener("resize", this.resizeEventHandler);
  }

  resized() {
    clearTimeout(this.resizeTimer);

    this.resizeTimer = setTimeout(() => {
      let ctx = this.canvas.getContext("2d");

      ctx.fillStyle = "green";
      ctx.font = "30px Arial";
      ctx.fillText(`Width: ${this.canvas.width}`,10,50);
    }, 150);
  }
}

【讨论】:

【解决方案2】:

我制作了一个使用包npm:element-resize-detector 的附加组件。这将检测到对 div 大小的所有更改,包括来自 css 动画的更改。

https://github.com/MeirionHughes/aurelia-resize

安装它:

npm install aurelia-resize --save

将其添加到您的配置中:

export function configure(aurelia) {
  aurelia.use
    .standardConfiguration()
    .plugin('aurelia-resize');

在你的视图模型上添加一个方法:

foo(detail){
    console.log("width=" + detail.width);
    console.log("height=" + detail.height);
    console.log("old width=" + detail.widthOld);
    console.log("old height=" + detail.heightOld);
}

然后通过添加resizeable 属性并绑定到resize 事件来使用它。

<div resizeable resize.trigger="foo($event.detail)">

【讨论】:

  • 拯救了这一天@merion-hughes。我在画布上遇到了完全相同的问题,该画布的容器在父级上使用 show.bind() 设置为零宽度。当 div 可见时,我需要调整画布的大小。在我偶然发现这篇文章之前,我找不到这样做的方法。现在我调用一个 resize 方法来响应容器宽度的变化。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 2020-12-12
  • 1970-01-01
相关资源
最近更新 更多