在 Meteor 中重用相同的块助手会导致奇怪的上下文问题

Reusing the same block helper in Meteor causes odd context issue

我正在尝试重用我编写的自定义 Block Helper,为我的一些模板提供基本轮播功能。

简单-carousel.html

<template name="SimpleCarousel">
  <div class="simple-carousel {{class}}">
    <div class="slides">
      {{#each slides}}
        {{> UI.contentBlock this}}
      {{/each}}
    </div>
    {{#if showControls}}
      {{> SimpleCarouselControls}}
    {{/if}}
  </div>
</template>

<template name="SimpleCarouselControls">
  // control structure here
</template>

简单-carousel.js

var actions = {
  back: function() {
    // move slide back once
  },
  forward: function() {
    // move slide forward once
  }
};

var showSlide = function() {
   // code to show the next slide 
};

Template.SimpleCarousel.onRendered(function() {
  // set up carousel logic here
});

Template.SimpleCarousel.events({
  'click [data-sc-move="forward"]': function() {
      actions.forward();
  },
  'click [data-sc-move="back"]': function() {
      actions.back();
  }
});

breaking_stories.html

<template name="BreakingStories">
  {{#SimpleCarousel class="breaking-stories" showControls=false autoForward=8000 slides=breakingStories}}
    {{> BreakingStorySlide}}
  {{/SimpleCarousel}}
</template>

<template name="BreakingStorySlide">
  <div class="breaking-story slide">
    <div class=breaking-story-title">{{title}}</div>
  </div>
</template>

breaking_stories.js

Template.BreakingStories.helpers({
  breakingStories: function() {
    return BreakingStories.find();
  }
});

daily_summary.html

<template name="DailySummary">
  {{#with thisDailySummary}}
    {{#SimpleCarousel class="daily-summaries" showControls=true slides=items}}
      {{> DailySummarySlide}}
    {{/SimpleCarousel}}
  {{/with}}
</template>

<template name="DailySummarySlide">
  <div class="daily-summary slide">
    <div class="daily-summary-title">{{title}}</div>
  </div>
</template>

我试图简化代码,因为模板中涉及的内容更多 HTML。不管怎样,如您所见,我已经定义了#SimpleCarousel 块帮助器并在两个地方使用了它:突发新闻部分和每日摘要部分。这两个模板刚好在同一个页面(路由),所以在页面上靠得很近。我需要其中一个自动循环,其中我向助手提供了 autoForward 属性,另一个应该只显示控件。

两个模板都可以很好地呈现并显示正确的数据,但问题在于突发新闻模板没有执行任何自动循环,而另一个模板执行了(并且执行了两次),就好像它们共享相同的一样上下文。

我的问题是,我可以在同一条路线上安全地多次使用自定义 Block Helpers 吗?我愿意接受有关如何以 better/different 方式执行此操作的任何建议。

感谢@JeremyK 为我指明了正确的方向;它恰好是我遗漏的确切代码,这就是问题所在。当然可以!

这是我在旧版本中的内容:

simple_carousel.js

var $slideContainer, $controls, $markers, $activeSlide, $nextSlide;

var actions = {
    back: function() {
        // move slide back
    },

    forward: function() {
        // move slide forward
    }
};

function showSlide() {
    // show the "next" slide
}

Template.SimpleCarousel.onRendered(function() {
    var data = this.data;

    $slideContainer = this.$('.sc-slides');
    // rest of this code is irrelevant
});

我原以为我在第一行声明的变量独立于我使用的模板的多个实例化,但我错了。 $slideContainer = this.$('.sc-slides'); 的第一次使用效果很好,但是 $slideContainer 和所有其他的都是共享的。

为了解决这个问题,我只是将本地 variables/actions 移动到 Template.SimpleCarousel.onRendered

Template.SimpleCarousel.onRendered(function() {
    var $slideContainer, $markers, ...

    this.actions = {
      //...
    };
});

Template.SimpleCarousel.events({
    'click [data-sc-move="forward"]': function( event, template ) {
        template.actions.forward();
    }
    //...
});