2015-09-23 51 views
0

我的Meteor应用程序出现问题。显然,数据表不能正确更新。当我保存一个新的数据时,它会自动添加一个新行,但表格没有正确更新(例如,它表示“显示6条目中的1到6条”,实际上它已经有7条条目了。)流星 - 使数据表无效

我也试图摧毁表,然后重新初始化它,但没有运气。我读过自动运行功能,但我不确定如何实现它。

有没有办法通过JS手动刷新/重新渲染模板?所以,只要我成功地将数据添加到集合中,我就可以刷新它。

这里是我的代码:

HTML:

<!-- Teams --> 
    <div class="col-lg-6"> 
     <div class="ibox float-e-margins"> 
      <div class="ibox-content"> 
       <p><h3>Teams Collection</h3></p> 
       <div class="hr-line-dashed"></div> 
       <div class="master-teams-table"> 
        <div class="table-responsive" style="overflow-x:initial !important;"> 
         <table class="table table-striped table-bordered table-hover teamsTable" > 
          <thead> 
           <tr> 
            <th class="text-center">Team Name</th> 
            <th class="text-center">Abbreviation</th> 
            <th class="text-center">Tower</th> 
           </tr> 
          </thead> 
          <tbody> 
           {{#each masterAllTeams}} 
            <tr> 
             <td>{{team_name}}</td> 
             <td>{{team_abbreviation}}</td> 
             <td>{{tower}}</td> 
            </tr> 
           {{/each}} 
          </tbody> 
         </table> 
        </div> 
       </div> 
      </div> 
     </div>  
    </div> 
    <!-- End of Teams --> 

助手:

UI.registerHelper("masterAllTeams", function() { 
    return TeamsCollection.find(); 
}); 

感谢您的帮助!

+0

如果您想显示条目的数量,例如显示“x”只是为它添加一个帮手,你没有发布那部分代码。 –

+0

我正在使用jquery Datatable,所以这部分应该是自动的。它看起来像新添加的行不在数据表本身上注册。 – user3545006

+0

使用一个类似'aldeed:tabular'的包,它为你处理大部分内容。 –

回答

1

您可以使用Tracker.autorun()监视被动更新。它为您提供了一个钩子函数,它在每次给定的被动源更新时触发。

假设您从某个模板的rendered调用启动了您的数据表。然后,您可以使用template's autorun

Template.teamsTemplate.onRendered(function() { 
    var teamsTable = $('.teamsTable').DataTable(); 
    this.autorun(function() { 
    TeamsCollection.find(); // triggers the autorun every time the collection is altered 
    teamsTable.ajax.reload(); 
    }); 
}); 

您还可以通过一些条件过滤减轻重载的数量。例如,如果每次单个文档的属性发生更改时都不想触发重新加载(它已由Blaze在模板中重写),则可以检查count()值是否已更改。

Template.teamsTemplate.onRendered(function() { 
    var teamsTable = $('.teamsTable').DataTable(); 
    var teamsCount = TeamsCollection.find().count(); 
    this.autorun(function() { 
    if (teamsCount !== TeamsCollection.find().count()) 
     teamsTable.ajax.reload(); 
    }); 
}); 

但要小心过滤重载,或者你可以用DataTable的分页遇到问题了:在文件变化的情况下顺序,例如,火焰可以更新你的项目的顺序,但数据表不会重新加载。我不太了解这个插件,但它可能会造成麻烦。