fabric.js rails 中的错误

fabric.js error in rails

我已将 fabric.js(dist 文件夹)包含在我的 rails 5 应用程序中 - vendor/assets/javascripts

我的视图文件中有一个 canvas html 元素 - view.html.erb

<div class="col-sm-6">
<canvas id="canvas" width="300" height="200" style="border:1px solid #000000">
</canvas>
</div>

然后我在 assets/javascripts/event.js 的 javascript 文件中访问上面的 canvas。

var canvas = new fabric.Canvas('can');
var circle = new fabric.Circle({
  radius: 20, fill: 'green', left: 100, top: 100
});
canvas.add(circle);

```

导航到该页面时出现以下错误,

fabric.self-85644f2….js?body=1:6519 Uncaught TypeError: Cannot create property 'style' on string 'can' at klass._createCanvasElement (fabric.self-85644f2….js?body=1:6519) at klass._createLowerCanvas (fabric.self-85644f2….js?body=1:6559) at klass._initStatic (fabric.self-85644f2….js?body=1:6249) at klass.initialize (fabric.self-85644f2….js?body=1:8496) at new klass (fabric.self-85644f2….js?body=1:1944) at event.self-e4cb5e2….js?body=1:3

这是我的 application.js

//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require fabric
//= require_tree .

更新

因此,当 canvas 代码包含在 DOM 就绪回调中时,我现在确实看到了 canvas 呈现。但是,我仍然不知道初始化结构的正确方法是什么,即等待 DOM 加载然后 运行 结构相关代码的正确方法。

显然,这是等待 DOM 就绪的方式 - http://guides.rubyonrails.org/working_with_javascript_in_rails.html#turbolinks。但是,我是否将此包装代码添加到我访问 canvas 的所有 javascript 文件中?

$(document).on('turbolinks:load', function() {
    var canvas = new fabric.Canvas('can');
    var circle = new fabric.Circle({
      radius: 20, fill: 'green', left: 50, top: 50
    });
    canvas.add(circle);
});

已编辑正确答案。

第 1 部分

在结构初始化之前需要加载文档和 turbolinks。

$(document).on('turbolinks:load', function() {
    var canvas = new fabric.Canvas('can');
    var circle = new fabric.Circle({
      radius: 20, fill: 'green', left: 50, top: 50
    });
    canvas.add(circle);
});

第 2 部分

您可以像这样创建一个可重复使用的函数

在app/assets/javascripts/application.js

var canvas = $(document).on('turbolinks:load', function() {
        new fabric.Canvas('can');
    });

使用 canvas 变量,您可以在任何需要的地方调用初始化的结构函数。喜欢下面

var circle = canvas.Circle({
    radius: 20, fill: 'green', left: 50, top: 50
});
canvas.add(circle);