// in server.js
Meteor.publish("directory", function () {
return Meteor.users.find({}, {fields: {emails: 1, profile: 1}});
});
// in client.js
Meteor.subscribe("directory");
Run Code Online (Sandbox Code Playgroud)
我现在想从客户端查询目录列表,就像directory.findOne()从浏览器控制台查询一样.//测试目的
执行directory=Meteor.subscribe('directory')/ directory=Meteor.Collection('directory')执行directory.findOne()不起作用,但是当我这样做directory=new Meteor.Collection('directory')并且返回undefined时我打赌它在服务器上创建一个我不喜欢的mongo集合,因为USER集合已经存在并且它指向一个新的集合而不是USER采集.
注意:我不想弄乱Meteor.users集合如何处理它的功能......我只想使用一个不同的句柄从它中检索一些特定的数据,该句柄只返回指定的字段而不是覆盖它的默认函数. .
例如:
Meteor.users.findOne() // will return the currentLoggedIn users data
directory.findOne() // will return different fields taken from Meteor.users collection.
Run Code Online (Sandbox Code Playgroud)
Tom*_*cik 12
如果您希望此设置起作用,则需要执行以下操作:
Meteor.publish('thisNameDoesNotMatter', function () {
var self = this;
var handle = Meteor.users.find({}, {
fields: {emails: 1, profile: 1}
}).observeChanges({
added: function (id, fields) {
self.added('thisNameMatters', id, fields);
},
changed: function (id, fields) {
self.changed('thisNameMatters', id, fields);
},
removed: function (id) {
self.removed('thisNameMatters', id);
}
});
self.ready();
self.onStop(function () {
handle.stop();
});
});
Run Code Online (Sandbox Code Playgroud)
在客户端,您不需要定义仅客户端集合:
directories = new Meteor.Collection('thisNameMatters');
Run Code Online (Sandbox Code Playgroud)
并订阅相应的数据集:
Meteor.subscribe('thisNameDoesNotMatter');
Run Code Online (Sandbox Code Playgroud)
这应该现在有效.如果您认为这种解释不够明确,请告诉我.
编辑
这里,这些self.added/changed/removed方法或多或少地作为事件调度程序.简单地说,他们给每个打电话的客户发出指示
Meteor.subscribe('thisNameDoesNotMatter');
Run Code Online (Sandbox Code Playgroud)
关于应该在客户端集合上应用的更新,thisNameMatters假定此集合存在.名称 - 作为第一个参数传递 - 几乎可以任意选择,但如果客户端没有相应的集合,则所有更新都将被忽略.请注意,此集合只能是客户端,因此它不一定必须与数据库中的"真实"集合相对应.
从你的publish方法返回一个游标,它只是上面代码的一个快捷方式,唯一的区别是使用了一个实际集合的名称而不是我们的名字theNameMatters.这种机制实际上允许您根据需要创建数据集的"镜像".在某些情况下,这可能非常有用.唯一的问题是这些"集合"将是只读的(完全有意义BTW),因为如果它们没有在服务器上定义,则不存在相应的"insert/update/remove"方法.
调用该集合Meteor.users,无需在服务器和客户端上声明新的集合.
您的发布/订阅代码是正确的:
// in server.js
Meteor.publish("directory", function () {
return Meteor.users.find({}, {fields: {emails: 1, profile: 1}});
});
// in client.js
Meteor.subscribe("directory");
Run Code Online (Sandbox Code Playgroud)
要访问服务器已发布的用户集合中的文档,您需要执行以下操作:
var usersArray = Meteor.users.find().fetch();
Run Code Online (Sandbox Code Playgroud)
要么
var oneUser = Meteor.users.findOne();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9695 次 |
| 最近记录: |