【问题标题】:Unexpected additional funtion calls in MeteorMeteor 中意外的附加函数调用
【发布时间】:2015-03-01 20:26:13
【问题描述】:

这是一个演示问题的模板。 randomArtist 是一个从 mongodb 返回文档的函数。我调用该函数 3 次,每次我使用该文档中的不同字段。

<template name="featuredArtist">
    <p>{{randomArtist.artistName}}</p>
    <p>{{randomArtist.description}}</p>
    <p>{{randomArtist.randId}}</p>
</template>

这是一个模板逻辑。 在服务器启动时,我用一些数据初始化集合,因此(我认为)应该从一开始就可用于 View 部分。 在客户端上,我得到一个随机文档,然后将其 id (randId) 存储在会话中,以便在下一次函数调用期间跳过彩票。 (PS。这不是关键,但欢迎任何改进建议,我是Meteor的初学者。)

Artists = new Mongo.Collection("artists");

if (Meteor.isServer) {
    Meteor.startup(function () {
        Artists.insert({ randId: 0, artistName: "Artis Name 1", image: "url", description: "Description of Artis Name 1"});
        Artists.insert({ randId: 1, artistName: "Artis Name 2", image: "url", description: "Description of Artis Name 2" });
        Artists.insert({ randId: 2, artistName: "Artis Name 3", image: "url", description: "Description of Artis Name 3" });
        Artists.insert({ randId: 3, artistName: "Artis Name 4", image: "url", description: "Description of Artis Name 4" });
        Artists.insert({ randId: 4, artistName: "Artis Name 5", image: "url", description: "Description of Artis Name 5" });
    });
}
if (Meteor.isClient) {
    Meteor.subscribe("artists");

    Template.featuredArtist.helpers({
        randomArtist: function(){
            var randId = Session.get("artistRandId");
            if(!randId){
                var rand = (Artists.find().count() * Math.random()) | 0;
                var artist = Artists.findOne({randId:{$lte:rand}}, {sort: {randId: -1}});
                if (!artist) {
                    artist = Artists.findOne( { randId : { $gte : rand } } );
                }
                if (!artist) {
                    console.log('Mongo.Artists is empty');
                } 
                else {
                    console.log(artist);
                    Session.set("artistRandId", artist.randId);
                    return artist;
                }
            }
            else {
                console.log('randId='+randId);
                return Artists.findOne( { randId: randId } );
            }            
        }
    });
}

工作演示在http://meteorpad.com/pad/MhwXS6MpXQoTYh4Lw/Artists

我在日志中观察到的是,“randomArtist”函数被调用了 7(!)次,而不是预期的 3 次,因为它在模板中被调用:

  • 3 次 vs 预期 0:console.log('Mongo.Artists is empty');
  • 1 次符合预期:console.log(artist);
  • 3 次 vs 预期 2 次:console.log('randId='+randId);

谁能解释我这些额外的电话是从哪里来的? 在我的实际应用程序中,我可以观察到更多的调用 - 可能是因为我使用了更复杂的模板,这确实意味着 featureArtist 嵌入到另一个模板中。

还不清楚如何在日志中看到集合是空的,因为它似乎在启动时已填充?

【问题讨论】:

    标签: meteor


    【解决方案1】:

    我不能说为什么你的助手被调用了 7 次,但你可以通过使用 #with 块助手来摆脱它,如下所示:

    <template name="featuredArtist">
        {{#with randomArtist}}
            <p>{{artistName}}</p>
            <p>{{description}}</p>
            <p>{{randId}}</p>
        {{else}}
            <p>Got no random artist :(</p>
        {{/with}}
    </template>
    

    并从您的助手中删除 artistRandId 会话。您的助手现在可能会被调用 2 次,因为模板可能会在客户端从艺术家订阅接收艺术家之前呈现(第二次发生在客户端收到艺术家时)。

    【讨论】:

    • 感谢使用#with 的提示 - 这就是我所缺少的!似乎呼叫次数与流星的“反应性”性质有关。要修复关于空集合的日志,应在 waitOn 模板的函数中添加订阅 - 实现示例:stackoverflow.com/questions/25538928/…
    猜你喜欢
    • 2020-08-13
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 2016-10-06
    相关资源
    最近更新 更多