如何在切换路线时重新创建模板?
例如,我有订阅者模板。它可以检测用户向下滚动到显示器并订阅更多数据。它需要几个参数。
示例: 的 amazing_page.html
{{#each}}
{{amazing_topic}}
{{/each}}
{{>subscriber name='topics' count=5}}
subscriber.js
//粗略的示例代码
Template.subscriber.onCreated(function() {
var self = this;
var type = Template.currentData().name;
var count = Template.currentData().count;
var user = Template.currentData().user;
var skipCount = 0;
self.autorun(function(c){
self.subscribe(type, skipCount, user);
var block = true;
$(window).scroll(function() {
if (($(window).scrollTop() + $(window).height()) >= ($(document).height()) && block) {
block = false;
skipCount = skipCount + count;
console.log(type);
console.log(skipCount);
self.subscribe(type, skipCount, user, {
onReady: function() {
block = true;
},
onStop: function() {
console.log('stopped');
}
});
}
});
})
});
我在不同的路线中使用不同参数的模板。 问题是如果用户切换一些路线,并在一个页面中向下滚动,他在另一个页面中获得的所有订阅者将在此页面中实际工作。更多的是,他们会为变量存储增加的值,并将完成所有包含的逻辑。
当我们使用Route.getName(例如)比较和订阅的name参数时,我发现了一个错误的决定。这不是最好的选择。有人可以帮助我找到一个好的做法吗?:)
简单示例:
我们有3条不同的路线:
1)新闻 2)视频 3)的主题
这些路线模板包含特殊的订户模板。订阅在滚动时工作正常。
好的,现在让我们访问所有这些:新闻,视频,主题。 好的,现在向下滚动...我有三个订阅者模板实例,它们将订阅他们自己的出版物,因为当我们切换路线时它们不会被销毁。
结果 - 当用户滚动主题页面时,他也会调用新闻和视频的订阅,他也会从这些收藏中获取数据;) 而且 - 这是一个问题:)
UPD: 看起来我们找到了决定。如果我使用Template.instance(autorun / subscribe)它将开始工作,除了一些奇怪的情况:)
首先,当我在下一次迭代(向下滚动)中进入另一条路线时,它会返回旧的,被破坏的模板+错误的数据。下一次(下一次迭代),它将开始订阅正确的数据。嗯......看起来我在自动运行部分有错误......或者不是吗?
从控制台附加打印屏幕 this
答案 0 :(得分:0)
听起来您对同一个集合有多个订阅,因此各种上下文中显示的文档列表可能会以意想不到的方式发生变化。 Meteor通过同步所选文档的 union 来管理同一集合上的多个订阅。
管理每个视图的最简单方法是确保特定视图的数据上下文使用.find()
和您需要的查询。这通常与您的出版物使用的查询相同。
当您离开视图时,一种不同但效率较低的方法是.stop()
订阅。