发布查询的流星不是被动的

时间:2017-09-10 18:09:55

标签: angularjs mongodb meteor

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

我们说我有很多文件,每个文件都有很多项目,所以我可以去路线:

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})
})

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

我遇到了很多问题,因为我认为meteor的工作方式类似于:"哦,有一个新项目,让我们重新运行查询,看看发布是否发生变化,如果是的话,让我们返回新的匹配文件" ...但是没有。

我没有发现类似于我的问题,因为每个问题都是关于如何反应性地更改查询(在这种情况下是file_id)的问题,但这不是问题,因为我不会改变除非我转到另一条路线,否则会触发新的订阅。

我目前的解决方案是公开完整的项目集合并使用minimongo进行查询,但我不知道它是否是一个好的解决方法(许多暴露的项目使用了太多的浏览器内存,minimalongo不是和mongo一样快......我真的不知道。

1 个答案:

答案 0 :(得分:3)

您的问题是Meteor.subscribe来电并不知道file_id已发生变化。该参数与执行订阅之间没有反应关系。

要解决此问题,只要您在发布 - 订阅中传递条件,就必须在跟踪器中编写Collection订阅。

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

虽然我不确定如何在Angular中执行此操作,但请将此简单的Blaze模板作为示例:

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

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

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