如何使Meteor对子项而不是父项产生反应
我有一个Newsfeed的想法,我想用Meteor建立这个想法,但是我正在努力弄清楚如何使新闻提要本身保持不变,这不是被动的,而是在更新子项(评论、喜欢等)后立即更新它们 我把所有的东西都储存在一个集合中,如果可能的话,我想保持这种状态。因此,集合的设置如下所示:如何使Meteor对子项而不是父项产生反应,meteor,Meteor,我有一个Newsfeed的想法,我想用Meteor建立这个想法,但是我正在努力弄清楚如何使新闻提要本身保持不变,这不是被动的,而是在更新子项(评论、喜欢等)后立即更新它们 我把所有的东西都储存在一个集合中,如果可能的话,我想保持这种状态。因此,集合的设置如下所示: [ { title: 'A random title', date_created: '01/01/2001', comments: [
[
{
title: 'A random title',
date_created: '01/01/2001',
comments:
[
{'message': 'Lorem ipsum', date_created: '01/01/2001'},
[...]
]
},
[...]
]
所以我想做的是让newsfeed无反应,这样当插入或更新新的新闻项时,保存新闻列表的模板就不会被重新呈现。但是,如果评论被添加、删除,或者有人喜欢新闻提要,我希望它立即在模板中得到更新
我一直在想如何使用{{{{隔离}}
和{{{常数}}
,但没有成功
这是我的客户端JS:
Template.group_feed.feed_data = function() {
var feed = Newsfeed.find({}, {
sort: {updated_time: -1},
limit: 10,
reactive: false
}).fetch();
return feed;
};
<template name="group_feed">
<div id="feed-wrapper">
<ul>
{{#each feed_data}}
{{> group_feed_item}}
{{/each}}
</ul>
</div>
</template>
<template name="group_feed_item">
<li>
<h1>{{title}}</h1>
<div class="comments">
{{#each comments}}
<p>{{message}}</p>
{{/each}}
</div>
</li>
</template>
我设置了reactive:false
,这样它就不会更新模板,但在更新评论或喜欢的内容时也会使模板保持静态。所以我猜有一个更好的方法来做到这一点,那就是让整个系列都无反应
这是我的模板代码:
Template.group_feed.feed_data = function() {
var feed = Newsfeed.find({}, {
sort: {updated_time: -1},
limit: 10,
reactive: false
}).fetch();
return feed;
};
<template name="group_feed">
<div id="feed-wrapper">
<ul>
{{#each feed_data}}
{{> group_feed_item}}
{{/each}}
</ul>
</div>
</template>
<template name="group_feed_item">
<li>
<h1>{{title}}</h1>
<div class="comments">
{{#each comments}}
<p>{{message}}</p>
{{/each}}
</div>
</li>
</template>
{{{#每个feed_data}
{{>组{u提要}
{{/每个}}
{{title}}
{{{#每个评论}
{{message}}
{{/每个}}
有人找到了一个很好的方法来实现这一点吗?我没有测试它,但我想最简单的方法是限制客户端的订阅,从而减少数据传输,消除对保留的需要: 可能是这样的: 在服务器上:
Meteor.publish('tenItemsBefore',function (time) {
Newsfeed.find({updated_time: {$lt time}}, {
sort: {updated_time: -1},
limit: 10
})}
在客户端上,在反应上下文中,例如在Meteor.autorun()中:
在客户端上,由事件触发,例如使用路由器包刷新:
Session.set('lastUpdate', (new Date()).getTime());
希望有帮助
最好的,Jan我没有测试它,但我想限制客户端的订阅是最直接的,这样可以减少数据传输,消除对保留的需求: 可能是这样的: 在服务器上:
Meteor.publish('tenItemsBefore',function (time) {
Newsfeed.find({updated_time: {$lt time}}, {
sort: {updated_time: -1},
limit: 10
})}
在客户端上,在反应上下文中,例如在Meteor.autorun()中:
在客户端上,由事件触发,例如使用路由器包刷新:
Session.set('lastUpdate', (new Date()).getTime());
希望有帮助
最好的,Jan我很确定问题在于您返回的是数组而不是光标。 似乎Spark与这两个角色的行为有所不同 从提要查询的末尾删除
.fetch()
关于这些东西如何工作的更多信息,我强烈建议大家看看Chris Mather在
具体而言,关于慢动作反应性的说明说明了阵列和光标之间的区别:
更新:在我最初的回答中,我并没有完全理解这个问题——我很抱歉,所以关于删除fetch()的部分对您没有帮助。以下是您可能希望探索的几个选项:
希望这些方法中的一种适合您。我很确定问题在于您返回的是数组而不是光标。 似乎Spark与这两个角色的行为有所不同 从提要查询的末尾删除
.fetch()
关于这些东西如何工作的更多信息,我强烈建议大家看看Chris Mather在
具体而言,关于慢动作反应性的说明说明了阵列和光标之间的区别:
更新:在我最初的回答中,我并没有完全理解这个问题——我很抱歉,所以关于删除fetch()的部分对您没有帮助。以下是您可能希望探索的几个选项:
希望这些方法中的一种适合您。如果出于某种原因,您不希望/无法限制客户在发布时看到的数据,或者如果可以插入具有较早发布时间的新帖子并破坏保存,则上述解决方案将不起作用。 因此,我建议采用不同的解决方案来更直接地交流
NewsCursor = NewsItems.find()
NewsCursor.observeChanges
changed: (id, fields) ->
if fields.comments
Session.set ("commentsForId"+id), fields.comments