У меня есть шаблон 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 в фото
- когда я заполняю свой холст тем же методом, но разными данными: например. Я перезагружаю другой идентификатор или загружаю другое фото. Как бы вы поступили?
Я попробовал два других подхода, оба перемещая холст в специальный шаблон:
Blaze.render()
шаблон в целевом div и прикрепите к шаблону холстаrendered
функцию моего кода. Это затрудняет контроль того, что загружено, а что нет: мне нужно удалить ранее обработанные шаблоны холста.- здесь объясняется обходной путь: Meteor: принудительное повторное отображение всего шаблона после обновление коллекции с помощью Blaze тоже не сработало (я особо не пробовал, не похоже на чистый обходной путь).
pageSession.set("displayMode", false)
внутри хукаtemplate.MyCanvas.onRendered
? Таким образом, вам не придется делать ничего странного с областью видимости. - person halbgut   schedule 26.06.2015