backbone marionette 元素呈现不正确

backbone marionette incorrect rendering of element

我正致力于在使用 PC 网络摄像头的基于 Web 的应用程序中实现 QR reader。这目前工作正常。

我使用的框架 (barcode.js) 有一个函数 render(element)。

我有 2 个不同的文件,ScannerView.html 和 ScannerView.js。请参阅下面的代码:

ScannerView.html

<!-- Content Header (Page header) -->
<section class="content-header has-background-image">
<div class="background">
    <img src="/assets/temp/header.png" />
</div>
<h1><div class="icon"><i class="fa fa-wrench"></i></div> <%=name%></h1>
</section>

<section class="content">
    // Withing the following div, the canvas element should be placed
    <div id="scanner"></div>
</section>

ScannerView.js

var YookrApp = require("../../setup");
var scanner = null;

var ScannerView = Backbone.Marionette.CompositeView.extend({
  template: require("./ScannerView.html"),
  className: "scannerView",

  ui: {
    scannerDiv: "#scanner"
  },

  name: "Yookr Code Scanner",

  initialize: function(options) {
  },

  onRender: function() {
    w69b.qr.decoding.setWorkerUrl("assets/w69b.qrcode.decodeworker.js");
    scanner =  new w69b.qr.ui.ContinuousScanner();
    // Called when a qr code has been decoded.
    scanner.setDecodedCallback(function(result) {
        console.log("Decoded qr code:", result);
    });
    scanner.setStopped(false);
    // Render component in element with id "scanner".
    console.log("Start rendering");
    scanner.render(this.ui.scannerDiv);
    console.log("Rendering done");
  },

  close: function() {
    // We have to dispose the scanner object.
    // If we don"t do this, the webcam will
    // always be enabled
    scanner.dispose();
  }
});

module.exports = ScannerView;

当我 运行 我的应用程序时,scanner.render() 函数应该在 <div id="scanner"></div> in ScannerView.html[= 中添加一个 <canvas> 元素56=]


问题

我无法使用位于我的 html 文件中的 <div id="scanner"></div> 使用 scanner.render() 正确渲染 canvas。我尝试使用 document.getElementById 和 this.ui.scannerDiv 得到不同但不正确的结果。

因为我在 ScannerView.js 文件中定义了一个 UI 元素,所以我应该可以调用 scanner.render(this.ui.scannerDiv); 这应该使用 div 在我的 html 视图中使用 id scanner,但是 canvas 根本没有呈现。在我的控制台中,我可以看到以下警告:

[.Offscreen-For-WebGL-0000020AB57365B0]GL ERROR :GL_INVALID_FRAMEBUFFER_OPERATION : glDrawArrays: framebuffer incomplete

[.Offscreen-For-WebGL-0000020AB57365B0]RENDER WARNING: texture bound to texture unit 2 is not renderable. It maybe non-power-of-2 and have incompatible texture filtering.

当我使用 scanner.render(document.getElementById("scanner")); 时,我可以看到 canvas 已呈现,但位置不正确。结果请看我添加的截图:

此时我卡住了。我不知道如何实现 canvas 以正确的 div.

呈现

搜索Google一段时间后,我找到了解决方案。

根据onRender: function() { }"gets triggered when the View's DOM subtree is prepared for insertion into the DOM but before those elements are viewable",根据this webiste.

在我的 javascript 文件中将 onRender 更改为 onShow 后,canvas 元素呈现在正确的位置。