2013-11-23 25 views
0

我正在构建一个测试应用程序,这是我学习编程时的第一个应用程序,所以如果我的术语关闭,请原谅我。为什么Meteor在刷新后复制数据库对象?

我跑流星版本0.6.6.3在Chromium浏览器版本30.0.1599.114

我有添加到集合假冒产品,如下面的代码所示。但是,由于某种原因,当我刷新浏览器或重新启动服务器后,每个产品都会在浏览器中重复显示,以便显示两个锤子,两个扳手等。我能够解决此问题的唯一方法是通过手动从数据库中删除产品。

我没有看到我的代码有任何问题,所以这与Meteor有什么关系?

任何帮助将不胜感激。

JS代码:

var Products = new Meteor.Collection("Products"); 

if (Meteor.isClient) { 

window.Products = Products; 

Products.insert({Name : "Hammer", Price : 4.50, InStock : true}); 
Products.insert({Name : "Wrench", Price : 2.70, InStock : true}); 
Products.insert({Name : "Screw Driver", Price : 3.00, InStock : false}); 
Products.insert({Name : "Drill", Price : 5.25, InStock : true}); 

Template.Products.ProductArr = function(){ 
    return Products.find({}, {sort: {Name: 1}}); 
}; 

Template.Products.events = { 
    "click .Product" : function(){ 
     if(this.InStock) 
     confirm("Would you like to buy a " + this.Name + " for " + this.Price + "$"); 
     else 
     alert("That item is not in stock"); 
    } 
}; 
} 

if (Meteor.isServer) { 
    Meteor.startup(function() { 
    // code to run on server at startup 
    }); 
} 

HTML低于,只是一个简单的模板。

<head> 
    <title>Products</title> 
</head> 

<body> 
    {{> Products}} 
</body> 

<template name="Products"> 
    {{#each ProductArr}} 
     <div class="Product"> 
     <h2>{{Name}}</h2> 
     <p>Price: ${{Price}}</p> 
     {{#if this.InStock}} 
      <p>This Item is in stock</p> 
     {{else}} 
      <p>This Item is currently sold out</p> 
     {{/if}} 
     </div> 
    {{/each}} 
</template> 

回答

1

那么,流星正在做的正是你告诉它:插入新的产品,当一个页面加载。如果你想,如果数据库是空的这才会发生,那么你需要添加一个后卫是这样的:

if (Products.find().count() === 0) { 
    Products.insert({Name : "Hammer", Price : 4.50, InStock : true}); 
    Products.insert({Name : "Wrench", Price : 2.70, InStock : true}); 
    Products.insert({Name : "Screw Driver", Price : 3.00, InStock : false}); 
    Products.insert({Name : "Drill", Price : 5.25, InStock : true}); 
} 

或者,你可以寻找到一个解决方案使用的upsert(http://docs.meteor.com/#upsert),这只会增加一个新项目如果它不存在。

+0

如果该代码在客户端上执行,它必须在客户端收到所有数据后执行,否则,客户端会认为Products集合是空的,尽管集合中存在客户端不是意识到呢。 –

+0

这对我有效,谢谢。 upsert看起来很有趣,所以我可能会在未来尝试。 – sapmub

0

在第一行中,您要求Meteor在服务器上创建Mongo文档,并在客户端上使用自动发布/订阅提供。

然后,在客户端你问流星插入4个产品。所以Meteor在客户端本地创建它们,然后它与服务器同步。所以他们在服务器上创建。

如果刷新,那么Meteor将在客户端和服务器上再次创建它们。 而且如果您一次又一次刷新,它会插入多次刷新。

您可以执行@ChristianF建议的操作:检查是否有文档,如果没有,请插入它们。 Personaly,我会在服务器端进行检查和插入,对未来更安全,因为您应该删除自动发布和不安全的软件包。

相关问题