首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板#每个&呈现

模板#每个&呈现
EN

Stack Overflow用户
提问于 2013-07-30 10:16:41
回答 2查看 110关注 0票数 0

为什么模板会呈现与我的模板中的每个关联的次数。

代码语言:javascript
复制
<template name="carousel">
<div class="pikachoose">
<ul class="carousel" >
{{#each article}}
    <li><a href="#"><img src="{{image}}" width="500" height="250"  alt="picture"/></a><span>{{caption}}</span></li>
{{/each}}
   </ul>
   </div>

</template>

Template.carousel.article = function () {
return News.find({},{limit: 3});

}

Template.carousel.rendered = function() {
//$(".pika-stage").remove();
alert($(".carousel").html());
//$(".carousel").PikaChoose({animationFinished: updateNewsPreview});
}

在这种情况下,它会报警3次。

EN

回答 2

Stack Overflow用户

发布于 2013-07-30 13:48:39

这就是Meteor处理数据更新的方式。您的article数据函数返回要在模板中使用的游标。最初,游标是空的,数据从服务器中拉出,一次一个项目。每次获取一篇文章时,光标的内容都会更改(现在又多了一篇文章),因此反应式article方法会导致模板重新呈现。

如果您需要确保您的代码只运行一次,根据您的需要,有几种可能性。

最简单的方法就是使用created而不是rendered

如果修改了DOM元素,还可以标记修改过的元素,这样就不会重复处理它们:

代码语言:javascript
复制
Template.carousel.rendered = function() {
    _.each(this.findAll('.class'), function(element){
        if($(element).data('modified')) return;
        $(element).data('modified', true);
        ...
    });
};

您可以禁用游标的反应性,尽管这是一个可悲的解决方案:

代码语言:javascript
复制
Articles.find(..., {reactive: false});

最具侵入性,但也是最通用的方法是观察数据何时完全加载:

代码语言:javascript
复制
Deps.autorun(function() {
    Meteor.subscribe('articles', {
        ready: function() {
            ...
        },
    });
});
票数 1
EN

Stack Overflow用户

发布于 2013-07-30 11:23:45

该问题可能与使用.rendered回调有关。每次循环运行时,DOM都会更新,因此回调将再次运行。

当我过去遇到这个问题时,我发现尽可能使用Meteor事件处理程序来消除像这样的加载顺序问题是很有帮助的。在这种情况下,也许您可以尝试超时,以便.remove().PikaChoose()调用仅在DOM处于安静状态一段时间后运行。希望这对你有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17937267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档