Я наткнулся на карусель изображений kenwheeler и пытаюсь заставить ее работать в моем приложении Meteor. Я использую обертку risul:slick.
Проблема в том, что рекомендуется инициализировать шаблон при рендеринге, но в этот момент изображения в подписке не обязательно все были загружены... если я использую статические изображения на локальном диске, все работает хорошо, но если я попытаюсь и создавать слайды в цикле {{#each}}, все идет не так.
Я попытался использовать блок {{#if Template.subscriptionsReady}} и вручную вызвать инициализатор с помощью помощника по шаблону, но это тоже не сработало.
Интересная вещь, которую я заметил, помещая оператор console.log в инициализатор, заключается в том, что кажется, что он вызывается три раза, когда я впервые перехожу на страницу, но когда я делаю обновление браузера, он вызывается только один раз и ломается (это происходит со статическим изображения, если у меня нет кода инициализации в блоке onRender?).
Код шаблона со статическими ссылками (работает до тех пор, пока вызов .slick() находится в блоке Template.image.onRendered):
<template name="image">
<div id="carousel">
<div id="demo-box"><img src="../../img/brush.jpg" /></div>
<div id="demo-box"><img src="../../img/drill.jpg" /></div>
<div id="demo-box"><img src="../../img/hammer.jpg" /></div>
<div id="demo-box"><img src="../../img/shovel.jpg" /></div>
<div id="demo-box"><img src="../../img/spanner.jpg" /></div>
<div id="demo-box"><img src="../../img/tape.jpg" /></div>
</div>
</template>
Реактивный шаблон
<template name="image2">
{{#if Template.subscriptionsReady}}
{{slickInit}}
<div id="carousel">
{{#each images}}
<div id="demo-box"><img src="{{url}}" /></div>
{{/each}}
</div>
{{else}}
<div>Loading...</div>
{{/if}}
</template>
Template.image.onCreated( () => {
// limit of images returned = 5
Template.instance().subscribe('images', 5);
});
Template.image.onRendered( () => {
$('#carousel').slick({
infinite: false,
dots: true,
slidesToShow: 1,
slidesToScroll: 1,
arrows: true
});
});
Template.image.helpers({
images() {
return Images.find();
},
// this is supposed to replace the onRender call
slickInit() {
$('#carousel').slick({
infinite: false,
dots: true,
slidesToShow: 1,
slidesToScroll: 1,
arrows: true
});
}
});