【问题标题】:Meteor with query on publication is not reactive对发布进行查询的流星不是反应性的
【发布时间】:2017-09-12 09:25:34
【问题描述】:

我有一个问题,流星出版物在其中使用查询时没有反应。

假设我有很多文件,每个文件有很多项目,所以我可以去路由:

http://localhost:3000/file/:file_id/projects

我想同时显示所选文件的项目并向其添加新项目。

我目前正在使用 angularjs,所以控制器看起来像这样:

class ProjectsCtrl {
  //some setup
  constructor($scope, $reactive, $stateParams){
  'ngInject'
  $reactive(this).attach($scope)
  let ctrl = this

  //retrieve current file id
  ctrl.file_id = Number($stateParams.file)

  //get info from DB and save it in a property of the controller
  ctrl.subscribe('projects', function(){return [ctrl.file_id]}, function(){
    ctrl.projects = Projects.find({file_id: ctrl.file_id}).fetch()
  })

  //function to add a new project
  ctrl.addProject = function(){
    if(ctrl.projectName){
      Meteor.call('projects.insert', {name: ctrl.projectName, file_id: ctrl.file_id }, function(error, result){
      if(error){
        console.log(error)
      }else{
        console.log(result)
      }
    })
  }
}

} }

出版物看起来像这样:

Meteor.publish('projects', function(file_id){
  return Projects.find({file_id: file_id})
})

问题是,如果我将新项目插入数据库,订阅不会再次运行,我的意思是数组保持不变,而不是显示我正在添加的新项目。

我遇到了很多问题,因为我认为流星会像这样工作:“哦,有一个新项目,让我们重新运行查询,看看发布是否改变,如果改变,让我们返回新的匹配文档” ...但没有。

我没有发现与我类似的问题,因为出版物中关于查询的每个问题都是关于如何被动更改查询(在这种情况下为 file_id),但这不是问题,因为我没有更改 file_id除非我去另一条路线,这会触发新的订阅。

我目前的解决方案是公开完整的项目集合并使用minimongo进行查询,但是我不知道这是否是一个好的解决方法(许多公开的项目使用了太多的浏览器内存,minimongo没有那么快作为mongo...等等,我真的不知道)。

【问题讨论】:

  • atmospherejs.com/reywood/publish-composite 为您在此处尝试执行的操作提供了更好的模式(在主从视图中显示详细文档)。
  • 尝试使用但结果相同;也许我用错了。我会再试一次并更新我的发现

标签: angularjs mongodb meteor


【解决方案1】:

您的问题是 Meteor.subscribe 调用不知道 file_id 已更改。该参数与执行订阅之间没有反应性关系。

要解决此问题,每当您在发布-订阅中通过条件时,您必须在跟踪器中编写 Collection 订阅。

要了解有关跟踪器的更多信息,Click here

虽然我不确定如何在 Angular 中执行此操作,但不妨以这个简单的 Blaze 模板为例:

Template.Name.onCreated(function(){
  this.autorun(() => {
    Meteor.subscribe('projects', file_id);
  });
});

每当file_id 更改时,都会触发新订阅,从而为您提供所需的自动发布-订阅实用程序效果。

我希望这会给你一些见解。它也可以通过 Angular JS 轻松实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    相关资源
    最近更新 更多