Как я должен убедиться, что реактивный элемент DOM был загружен?

У меня есть шаблон image, где я отображаю изображения. Отображение изображения переключается между тегами canvas и img в зависимости от того, создал ли пользователь изображение только что или оно уже находится на сервере.

Я переключаюсь между img и canvas, используя реактивный словарь с именем pageSession, где я храню логическую реактивную переменную с именем displayMode. У меня есть помощник currentDisplayMode, используемый для возврата значения displayMode.

Итак, помощник выглядит так:

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

и в моем шаблоне я загружаю canvas или img в зависимости от currentDisplayMode следующим образом:

{{#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

Я не могу найти свой холст, потому что пользовательский интерфейс еще не обновлен.

<сильный>2. Мое грязное исправление

Я использую Meteor.setTimeout(), чтобы исправить это:

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

<сильный>3. Мой вопрос

Это исправление работает до сих пор, но меня беспокоят случаи, когда 100 мс будет недостаточно для обновления пользовательского интерфейса. Более того, я не чувствую, что это надежное решение.

Обратите внимание, что это не просто двоичный переключатель (изображение или холст). Холст необходимо перерендерить в зависимости от 3 разных режимов (identicon, photo, imageFile). Каждый режим также может быть перерендерен.

Подводя итог, мне нужно правильно заполнить мой холст в нескольких случаях (после того, как я убедился, что он был отрендерен ранее):

  • когда displayMode переключается: с <img> на <canvas>
  • когда я заполняю свой холст другим способом: например, из identicon в фото
  • когда я заполняю свой холст тем же методом, но разными данными: например. Я перезагружаю другой идентификатор или загружаю другое фото. Как бы вы поступили?

Я попробовал два других подхода, оба перемещая холст в специальный шаблон:


person Billybobbonnet    schedule 26.06.2015    source источник
comment
Почему вы не можете запустить то, что хотите запустить после pageSession.set("displayMode", false) внутри хука template.MyCanvas.onRendered? Таким образом, вам не придется делать ничего странного с областью видимости.   -  person halbgut    schedule 26.06.2015


Ответы (1)


Наконец-то мне удалось это решить. По сути, я хотел убедиться, что мой холст был отрендерен, прежде чем выполнять одну из трех моих задач по заполнению (идентикон, фото, файл изображения).

Первый шаг самый простой: я использую флаг canvasLoaded реактивной переменной сеанса страницы, который я обновляю в своих функциях шаблона холста rendered и destroyed.

Второй шаг — это то, что я уже использовал, чтобы убедиться, что файл был загружен (и его URL-адрес доступен) при отправке формы. Это функция waitfor, которую я нашел здесь: https://stackoverflow.com/a/14811679/3793161

Итак, что я делаю, так это жду, когда мой флаг canvasLoaded переключится на true в функции waitfor. В обратном вызове waitfor я просто вызываю функцию loadCanvas, где я загружаю холст в соответствии с текущим режимом заполнения и параметрами (все они хранятся в переменных реактивного словаря).

И вуаля! :-)

person Billybobbonnet    schedule 28.06.2015