0

我正在尝试通过启动 blaze helpers 来制作 Flickity Carousel。我确实有以下错误:

Exception in template helper: TypeError: $(...).flickity is not a function

这是我的轮播模板助手:

Template.carouselTemplate.onCreated(function bodyOnCreated() {
  this.state = new ReactiveDict();
  Meteor.subscribe('albums');
})

Template.carouselTemplate.helpers({
  albums() {
    return Albums.find({});
  },
  initializeCarousel () {
    $('.carousel').flickity({
      // options
      "lazyLoad": true
    });
  }
});

和模板本身:

<template name='carouselTemplate'>

<div class="carousel">

   {{#each albums}}
   <div class="carousel-cell">
     <img src={{cover}} alt="cat nose" />
   </div>
   {{/each}}
   {{initializeCarousel}}

</div>

<template />

PS:我愿意接受其他方式来完成这项工作。

4

1 回答 1

1

首先确保您使用以下选项之一包含Flickity库:

1) 为您的应用程序添加正确的 JS 引用。例如:

/client/main.html

<head>
  <script src="https://npmcdn.com/flickity@2.0/dist/flickity.pkgd.min.js"></script>
</head>

或者

2) 将 Flickity 库的副本嵌入到您的应用程序中。为此,您将flickity.pkgd.js在应用程序/client/compatibility目录中存储文件的副本(有关详细信息,请参阅指南的特殊目录部分)。

或者

3) 如果使用 Meteor 1.3+,请使用 npm 安装库:meteor npm install --save flickity

安装库后,不要通过模板帮助程序初始化轮播,而是将初始化代码移动到模板onRendered回调中。在该回调中,将您的 flickity 初始化包装在 aTracker.autorun中,以确保Albums首先加载结果。就像是:

Template.carouselTemplate.onCreated(function bodyOnCreated() {
  this.state = new ReactiveDict();
  Meteor.subscribe('albums');
});

Template.carouselTemplate.onRendered(function onRendered() {
  this.autorun(() => {
    if (Albums.find().count()) {
      $('.carousel').flickity();
    }
  });  
});

Template.carouselTemplate.helpers({
  albums() {
    return Albums.find({});
  }
});

通过onRendered回调调用它意味着它将在模板准备好并插入到 DOM 后被调用(这是操作 DOM 的 jquery 库所必需的)。initializeCarousel然后,您可以从模板中删除呼叫。

于 2016-08-08T13:45:44.230 回答