我遇到一个问题,即流星出版物在其中使用查询时没有被动反应。
我们说我有很多文件,每个文件都有很多项目,所以我可以去路线:
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一样快......我真的不知道。
答案 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轻松实现。