我有一个meteorjs模板,我用它来渲染一些记录。我想要做的是,当数据库发生任何变化时,我想手动调用模板渲染方法。我可以从DOM重新加载一个模板以反映更改吗?我的代码是
<template name="textlines">
<table class="table table-striped table-bordered table-condensed table-hover listing"
id="content_listing-table">
<thead>
<tr>
<th>Text Lines</th>
</tr>
</thead>
<tbody>
{{#each textline}}
<tr>
<td>
<a href="#" data-id={{_id}} class="edit"> {{texts}}</a>
</td>
</tr>
{{/each}}
</tbody>
</table>
</template>
我的流星渲染方法就像
Template.textlines.rendered = function () {
$("#content_listing-table").dataTable();
}
现在我想在数据库上进行CRUD操作后手动调用此Template.textlines.rendered
方法。我不知道我的要求是对还是错,是否有可能。我在使用dataTables时遇到了一些问题。所以我想每次手动刷新模板,将数据库返回的内容添加到dataTable。感谢
答案 0 :(得分:3)
看起来您正在使用jQuery DataTables插件,而您在使用数据库更新的插件维护DOM时遇到了问题。
如果是这样,您可以观察您的收藏并使用他们的API进行更改。
例如:
Template.textlines.created = function() {
var _watch = Collection.find({});
var handle = _watch.observe({
addedAt: function (doc, atIndex, beforeId) {
$('#content_listing-table').dataTable().fnAddData(doc);
},
changedAt: function(newDoc, oldDoc, atIndex) {
$('#content_listing-table').dataTable().fnUpdate(newDoc, atIndex);
},
removedAt: function(oldDoc, atIndex) {
$('#content_listing-table').dataTable().fnDeleteRow(atIndex);
}
});
};
此StackOverflow answer中有更多信息。
答案 1 :(得分:1)
嗯。我怀疑即将推出的Meteor UI版本将使得jQuery UI插件在Meteor中正常工作,因此不会诱惑人们使用Meteor反模式,但这里有一些可以实现你想要的东西:
Deps.autorun(function () {
var htmlString = Template.textlines({textlines: Textlines.find()});
$("#content_listing-table").replaceWith(htmlString);
$("#content_listing-table").dataTable();
});
有了这个,您需要将{{> textlines}}
替换为<table id="content_listing-table">
。