如何使Meteor对子项而不是父项产生反应

如何使Meteor对子项而不是父项产生反应,meteor,Meteor,我有一个Newsfeed的想法,我想用Meteor建立这个想法,但是我正在努力弄清楚如何使新闻提要本身保持不变,这不是被动的,而是在更新子项(评论、喜欢等)后立即更新它们 我把所有的东西都储存在一个集合中,如果可能的话,我想保持这种状态。因此,集合的设置如下所示: [ { title: 'A random title', date_created: '01/01/2001', comments: [

我有一个Newsfeed的想法,我想用Meteor建立这个想法,但是我正在努力弄清楚如何使新闻提要本身保持不变,这不是被动的,而是在更新子项(评论、喜欢等)后立即更新它们

我把所有的东西都储存在一个集合中,如果可能的话,我想保持这种状态。因此,集合的设置如下所示:

[
    {
        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()的部分对您没有帮助。以下是您可能希望探索的几个选项:

  • 使用Meteor.observe或监视注释字段的更改,并使用代码(“手动”)更新DOM

  • 在服务器端创建一个自定义集合,仅发布来自原始集合的注释。所以我不是建议您更改存储在mongo中的数据模型,只是发布它的不同视图。通过这种方式,可以更轻松地继续使用模板更新注释

  • 初始加载集合后,记下已查看的项目ID,然后订阅集合,并传递要监视的ID列表(或日期范围)。这将需要一个新的发布函数,它接受一组ID,并过滤返回的文档。这种方法可以防止新文档干扰屏幕上的内容,您仍然会得到注释更改,但也会得到影响非注释字段的删除和字段更改


  • 希望这些方法中的一种适合您。

    我很确定问题在于您返回的是数组而不是光标。 似乎Spark与这两个角色的行为有所不同

    从提要查询的末尾删除
    .fetch()

    关于这些东西如何工作的更多信息,我强烈建议大家看看Chris Mather在

    具体而言,关于慢动作反应性的说明说明了阵列和光标之间的区别:

    更新:在我最初的回答中,我并没有完全理解这个问题——我很抱歉,所以关于删除fetch()的部分对您没有帮助。以下是您可能希望探索的几个选项:

  • 使用Meteor.observe或监视注释字段的更改,并使用代码(“手动”)更新DOM

  • 在服务器端创建一个自定义集合,仅发布来自原始集合的注释。所以我不是建议您更改存储在mongo中的数据模型,只是发布它的不同视图。通过这种方式,可以更轻松地继续使用模板更新注释

  • 初始加载集合后,记下已查看的项目ID,然后订阅集合,并传递要监视的ID列表(或日期范围)。这将需要一个新的发布函数,它接受一组ID,并过滤返回的文档。这种方法可以防止新文档干扰屏幕上的内容,您仍然会得到注释更改,但也会得到影响非注释字段的删除和字段更改


  • 希望这些方法中的一种适合您。

    如果出于某种原因,您不希望/无法限制客户在发布时看到的数据,或者如果可以插入具有较早发布时间的新帖子并破坏保存,则上述解决方案将不起作用。 因此,我建议采用不同的解决方案来更直接地交流
    NewsCursor = NewsItems.find()
    NewsCursor.observeChanges
      changed: (id, fields) ->
        if fields.comments
          Session.set ("commentsForId"+id), fields.comments