将Meteor与blaze模板和流路由器配合使用,我发现如果创建一个新元素,则该页面不会更新以显示该元素,但是如果删除相同的元素,它将立即消失。这是模板代码:<template name="EditProject"> ... {{#each currentCounts }} <div class="count-box">{{> CountDelete }}</div> {{/each}} ... <btn class="btn waves-effect waves-light h-button" id="add-count">Add Count</btn> ...</template><template name="CountDelete"> <div class="card blue-grey lighten-2 count-box"> <div class="card-content white-text"> <span class="card-title"> {{ name }} </span> {{ notes }} </div> <div class="card-action"> <btn class="btn waves-effect waves-light delete-count"> <i class="mdi mdi-delete"></i> </btn> <a class="btn waves-effect waves-light" href="/edit_count/{{ _id }}"> <i class="mdi mdi-pencil"></i> </a> </div> </div></template>currentCounts的来源是这样的:Template.EditProject.helpers({ currentCounts: function() { var projectId = FlowRouter.getParam('projectId'); const project = Projects.findOne(projectId); var counts = Counts.find({ _id: { $in: project.counts } }, { sort: { sort_order: -1 } } ); return counts; }})如前所述,单击.delete-count按钮将删除关联的计数,并使UI更新以显示其已消失。添加计数(通过单击#add-count)可以正确创建计数,但是页面不会更新。短暂的闪烁,仅此而已,刷新页面会显示新的计数。有人可以建议发生什么事吗?编辑:这是订阅,按评论的要求:Template.EditProject.onCreated(function() { var self = this; self.autorun(function() { var projectId = FlowRouter.getParam('projectId'); self.subscribe('single-project',projectId); self.subscribe('project-counts',projectId); })})进一步编辑:首次访问此路由时,页面将按应有的方式呈现,并通过{{#each currentCounts}}列出了多个计数。如果删除其中一个计数,它会立即从屏幕上消失,但是如果添加一个新计数,则在刷新页面之前不会显示。另一个编辑:根据请求添加了侦听器和服务器发布代码(在server / main.js中)。奇怪的是,当再次启动该应用程序时,一切都开始按其应有的方式运行,但是在几分钟之内,我一直描述的相同行为又重新确定了自身。Meteor.publish('project-counts', function projectPublication(projectId) { let project = Projects.findOne({_id: projectId, knitter: this.userId}); return Counts.find({_id: { $in: project.counts }});});Meteor.publish('single-project', function projectPublication(projectId) { return Projects.find({_id: projectId, knitter: this.userId});});'click #add-count'(event) { //TODO: Check for duplicate count name var projectId = FlowRouter.getParam('projectId'); var countName = $('#new-count').val(); var countNotes = $('#new-count-notes').val(); if (!countName) { $("#errors-go-here").empty(); Blaze.renderWithData(Template.EditProjectErrors, { errors: ['You must supply a name for the new count.'] }, $("#errors-go-here")[0]) $('.modal').modal(); $('#validation-errors').modal('open'); return; }Template.EditProject.events({ ... Meteor.call('projects.add-count',projectId,countName,countNotes, function(error) { if (error) { console.log("Count add error: " + error); Materialize.toast('Failed to add count \'' + countName + '\'!', 3000, 'orange darken-4'); return false; } else { Materialize.toast('Count \'' + countName + '\' added!', 3000, 'blue-grey'); $('#new-count').val(null); $('#new-count-notes').val(null); // Running this makes the missing count show up, but this is clearly not the right way to do it... //location.reload(); } }); }, ...)}Template.CountDelete.events({ 'click .delete-count'(event) { var self = this; var projectId = FlowRouter.getParam('projectId'); var countId = self._id; const count = Counts.findOne(countId); const name = count.name; Meteor.call('projects.delete-count',projectId,countId, function(error) { if (error) { console.log("Count add error: " + error); Materialize.toast('Failed to delete count \'' + name + '\'!', 3000, 'orange darken-4'); return false; } else { Materialize.toast('Count \'' + count.name + '\' deleted!', 3000, 'blue-grey'); } }); },})进一步的信息:我发现,一旦页面被加载,它的行为就会正常。但是,如果重新加载它,它将开始行为异常。因此,最初我不会注意到发生了正确的行为,因为由于更改了代码,流星刷新了页面。 最佳答案 为了完整起见,您可能还应该共享方法代码(即'projects.add-count'和'projects.delete-count')。话虽这么说,我怀疑他们用counts等于_id集合中的projectId来更新文档的Projects数组字段。在这种情况下,查看您的'project-counts'发布,我们看到它依赖于Projects.findOne查询,该查询在使用标准Meteor的服务器端不起作用。因此,当您添加“计数”时会发生什么情况,就是将一个新文档添加到Counts集合中,并且很可能将其_id正确记录在项目的counts字段中,但这不会重新执行您的发布码。因此,游标选择器查询保持不变,并且您的客户端在其Counts集合中未进行任何修改。假设您的方法代码已同时加载到客户端和服务器中,则客户端将执行存根/模拟,以插入此新文档并在本地更新项目的counts,从而触发UI更新。但是随后您的服务器也会执行该方法,这不会导致发布中发生任何更改,因此Counts中的新文档不会发送给客户端,这会将其隐藏起来。这会产生您观察到的闪烁。现在,当您从Counts删除文档时,我们可以假定特别是将其从Counts集合中删除,该集合随后将更新发布游标,这就是为什么即使发布查询选择器是UI也能正确反映出删除的原因没有改变。最后,当您刷新页面时,将使用Projects集合中文档的最新版本完全重新评估发布代码,这将导致正确的查询选择器,因此,新光标现在将新添加的文档包括在。然后,要解决您的问题,应尝试使用反应性联接或发布复合程序包。例如。参见https://stackoverflow.com/a/32920733/5108796(Meteor.publish: publish collection which depends on other collection)关于javascript - meteor 模板更新不一致,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43167667/
10-12 12:35