【发布时间】: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 为您在此处尝试执行的操作提供了更好的模式(在主从视图中显示详细文档)。
-
尝试使用但结果相同;也许我用错了。我会再试一次并更新我的发现