【发布时间】:2014-12-01 00:00:32
【问题描述】:
我可能遗漏了一些东西,但 Meteor 的“魔法”似乎围绕着将数据绑定到 DOM 元素,以及通过把手更新文本和 HTML 片段:http://docs.meteor.com/#reactivity
这很好,然而,当尝试编写一个在
var g = canvas.getContext('2d')
g.fillRect(x, y, w, h)
而不是 HTML 模板中的数据支持文本。
我正在尝试使用 Meteor.Collection 中的数据在画布上绘图。
我唯一的想法是将画布绘图 JS 代码嵌入 HTML 模板中的一个由把手变量填充的脚本标记中,但这似乎是错误的,因为流星的事件和数据绑定代码已经是客户端 JS。
有什么方法可以监听实时数据变化,通过 JS 而不是 HTML 元素/文本触发在画布上绘图?
如果我能以某种方式澄清问题,请告诉我
更新: 下面汤姆的回答让我注意到 Meteor.deps,它看起来允许在反应式上下文中执行任意代码: http://docs.meteor.com/#on_invalidate
如果可行,我会尝试并在此处更新。
【问题讨论】:
-
我不确定这是否是您所说的“嵌入...在脚本标签中”的意思。目前我正在做一些事情,比如将 {{drawCanvas}} 放在包含我的画布的模板中,并在名为“drawCanvas”的 Template.canvas.helper 的一部分的函数内进行所有绘图,此函数不返回任何内容,因此不会渲染任何内容,但它会被执行,因此它将更新画布。那是你已经尝试过的吗? Template.name.helper 是自动响应的,只要它依赖于 ReactiveDict 或某个模型,它就会在更改时相应更新
-
我的意思是在模板中动态生成 JS 代码作为字符串(这显然很奇怪)。我在下面的回答似乎是 Meteor 的“正确”方式
-
这真是荒谬!但是我的方法看起来好吗?这个想法只是使用一个不可见的 {{drawCanvas}},它什么都不做,只要一些反应性数据发生变化(从而重新绘制画布),它就会重新运行
-
这听起来像是一个聪明的解决方案!可能想要比较方法之间的性能并报告。
标签: meteor