【问题标题】:Template #each & rendering模板#each & 渲染
【发布时间】:2013-07-30 14:02:06
【问题描述】:

为什么模板的渲染次数与我的模板中的 Each 相关。

<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 次。

【问题讨论】:

    标签: templates meteor


    【解决方案1】:

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

     


     

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

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

    如果你修改了 DOM 元素,你也可以标记你修改的元素,这样你就不会处理两次了:

    Template.carousel.rendered = function() {
        _.each(this.findAll('.class'), function(element){
            if($(element).data('modified')) return;
            $(element).data('modified', true);
            ...
        });
    };
    

    您可以禁用光标的反应性,虽然这是一个可悲的解决方案:

    Articles.find(..., {reactive: false});
    

    最具侵入性,但也最通用的是观察数据何时满载:

    Deps.autorun(function() {
        Meteor.subscribe('articles', {
            ready: function() {
                ...
            },
        });
    });
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • .rendered 不是问题的原因,而是一个指标。问题是反应性的副作用。此外,使用超时来等待获取数据是一个可怕的想法。
      猜你喜欢
      • 2010-11-30
      • 2015-08-07
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      • 2017-03-24
      • 2013-07-11
      • 2012-05-08
      • 1970-01-01
      相关资源
      最近更新 更多