2016-02-25 126 views
0

此代码显示我的应用程序中MenuItems集合中的项目,但在开发过程中,当服务器重新运行时,列表将获得添加到旧“重复项目”的新列表。
我只需要一个列表,而不是重复。服务器重新启动时模板重复列表项目

为什么会发生这种情况,以及如何解决它?由于

///////////////////////////////////// 
//  client code 
/////////////////////////////////////  
<template name="mainMenu"> 
    <div class="container"> 
    <div class="row"> 
     <section class="col-xs-12"> 
     <div class="list-group menuItems"> 
      {{#each menuItems}} 
      <li data-template="{{menuItem}}" role="presentation"> 
       <a href="#" class="list-group-item menuItem"> 
       <img src="/abc.png"> 
       {{menuItem}} <span class="badge">&#x3e;</span> 
       </a> 
      </li> 
      {{/each}} 
     </div> 
     </section> 
    </div> 
    </div> 
</template> 

Template.mainMenu.onCreated(function() { 
    var template = this; 
    template.handler = template.subscribe('menuItems'); 
}); 

Template.mainMenu.helpers({ 
    menuItems: function() { 
    return MenuItems.find(); 
    } 
}); 

Template.mainMenu.onDestroyed(function() { 
    var template = this; 
    if (template.handler && template.handler.stop) template.handler.stop(); 
}); 

///////////////////////////////////// 
//  server code 
/////////////////////////////////////  
var items = 
    [ 
    {menuItem: "task1", group: "ab"}, 
    {menuItem: "task2", group: "ab"}, 
    {menuItem: "task3", group: "b"}, 
    {menuItem: "task4", group: "a"}, 
    {menuItem: "task5", group: "a"}, 
    {menuItem: "task6", group: "a"}, 
    {menuItem: "task7", group: "b"}, 
    {menuItem: "task8", group: "b"}, 
    {menuItem: "task9", group: "b"}, 
    {menuItem: "login", group: "ab"}, 
    {menuItem: "logout", group: "ab"} 
    ] 
_.each(items, function (doc) { 
    MenuItems.insert(doc); 
}) 
+0

您不需要手动取消订阅'onDestroyed'。只是尝试没有这个 –

回答

1
_.each(items, function (doc) { 
    MenuItems.insert(doc); 
}) 

代码这个片段插入数据的每台服务器启动的新的一群,从而导致您的收藏与成长每次运行。你可以很容易地检查它,如果你看看你的收藏(meteor shellmeteor mongo可以帮助)。将其包裹在此构造中

if (!MenuItems.find().count()) { 
    _.each(items, function (doc) { 
     MenuItems.insert(doc); 
    }) 
} 
+0

好的答案。我今天没有更多的赞扬,明天我会投票赞成。 :)。还有一件事是在'if'条件中也包含'items'声明。 :) – Kishor

+0

是的,当然你可以在里面包含“items”,但更多的是关于代码的可读性。你可以把它放在一个函数中,像'initFill'一样调用它(只是一个例子) –

+1

是的,可读性是一回事,性能是另一件重要的事情。尽管在这种情况下它没有区别,但它在'!MenuItems.find()。count()'也是'false'时仍然增加了创建'items'数组的不必要开销。 :) – Kishor