我应该如何确保已加载反应性 DOM 元素?

How should I make sure that a reactive DOM element has been loaded?

我有一个显示图像的模板 image。图片显示在 canvasimg 标签之间切换,具体取决于用户是刚刚创建图片还是已经在服务器上。

我使用名为 pageSession 的反应字典在 imgcanvas 之间切换,我在其中存储了一个名为 displayMode 的布尔反应变量。我有一个助手 currentDisplayMode 用于 return displayMode 值。

所以助手看起来像这样:

Template.image.helpers({
    "currentDisplayMode" : function(){
        return pageSession.get ("displayMode");
    }
});

在我的模板中,我根据 currentDisplayMode 加载 canvasimg,如下所示:

{{#if currentDisplayMode}}
  <img src="{{source}}"width="215" height="215"/>
{{else}}
  <canvas id="canvas" width="215" height="215"></canvas>
{{/if}}

1.问题.

如果我尝试这样的事情:

pageSession.set("displayMode", false)
var canvas = template.find('#canvas')
//do stuff related to canvas

我找不到我的 canvas 因为 UI 还没有更新。

2。我的脏修复

我用这样的 Meteor.setTimeout() 来修复它:

    pageSession.set("displayMode", false)
    Meteor.setTimeout(function(){
        var canvas = template.find('#canvas')
        //do stuff related to canvas
        }, 100);

3。我的问题

此修复目前有效,但我担心 100 毫秒不足以更新 UI 的情况。而且,我觉得这不是一个可靠的解决方案。

请注意,它不仅仅是二进制切换(图像或canvas)。 canvas 需要根据 3 种不同的模式(identicon、photo、imageFile)重新渲染。每种模式也可以重新渲染。

总而言之,我需要在几种情况下正确填写我的canvas(一旦我确定它之前已经渲染过):

我尝试了另外两种方法,都是通过将 canvas 移动到专用模板中:

我终于设法解决了这个问题。基本上,我想要的是确保在执行我的 3 个填充任务(identicon、照片、图像文件)之一之前渲染了我的 canvas。

第一步很简单:我使用页面会话反应变量标志 canvasLoaded,我在 rendereddestroyed canvas 模板函数上更新了它。

第二步是我已经用来确保在表单提交时上传了文件(并且它的 url 可用)的东西。这是我在这里找到的 waitfor 函数:

所以我要做的是等待我的标志 canvasLoadedwaitfor 函数中切换为 true。在 waitfor 的回调中,我只是调用了一个 loadCanvas 函数,我根据当前的填充模式和参数(全部存储在反应字典变量中)加载 canvas。

瞧瞧! :-)