我想显示当前在线的用户和关注特殊页面的用户。在这个页面的某个地方,我喜欢显示用户列表和状态(在线/离线聚焦/无聚焦)
我发现了这个包:benjamirh/event-hooks
设置很清楚,这在文档中。但是我不知道如何使用钩子。例如:
Hooks.onLoseFocus = function ([server: userId]) { ... }
(任意位置)-在窗口失去焦点时提供要运行的回调。
所以函数需要一个userId。
考虑到上面的布局,我会在某个地方有一个额外的模板和一个类似于的每个循环
{{#each userstatus}}
{{>users_stats}
{{/each}}
当钩子获取单个userId时,我将如何创建用户状态?
好的,这里有一个完全可用的解决方案,它可以跟踪当前查看特定路由路径的用户,并通过助手显示此用户列表。这是在假设您使用iron:router
:的情况下工作的
服务器:
Hooks.onCloseSession = function() {
Meteor.call('clearUserFocus', function(error, result) {
if(error)
console.log(error);
});
}
Meteor.methods({
'setUserFocus': function(_routePath) {
Meteor.users.update({_id: Meteor.userId()}, {$set: {focus: _routePath}});
},
'clearUserFocus': function() {
var userId = Meteor.userId();
Meteor.users.update({_id: userId}, {$unset: {focus: ''}});
}
});
onCloseSession
似乎只在服务器中可靠地工作,正如您所期望的那样。
客户端:
Meteor.startup(function() {
// Start hooks, for user focus tracking
Hooks.init({
updateFocus: 500
});
});
Hooks.onGainFocus = function() {
// Router.current().route.getName(); // route name
var routePath = Iron.Location.get().pathname; // route path
Meteor.call('setUserFocus', routePath, function(error, result) {
if(error)
console.log(error);
});
}
Hooks.onLoseFocus = function() {
Meteor.call('clearUserFocus', function(error, result) {
if(error)
console.log(error);
});
}
客户端全局路由器:
Router.onBeforeAction(function() {
// Record user focus
var routePath = Iron.Location.get().pathname;
Meteor.call('setUserFocus', routePath, function(error, result) {
if(error)
console.log(error);
});
this.next();
});
客户端模板帮助程序:
Template.yourTemplateName.helpers({
'focusedUsers': function() {
var routePath = Iron.Location.get().pathname;
return Meteor.users.find({focus: routePath});
}
});
客户端模板:
<ul>
{{#each focusedUsers}}
<li>{{_id}}</li>
{{/each}}
</ul>
这对我来说效果很好,我需要彻底测试它,因为我发现了至少一个警告。在运行多个窗口的情况下,它似乎会与焦点混淆。
还要注意,您需要所有的路由都可以访问users
发布(无论您的发布名为什么),以便帮助者可以访问集合并获取focus
。你可以这样做:
// Global router settings
Router.configure({
layoutTemplate: 'defaultLayout',
loadingTemplate: 'loading',
waitOn: function() {
return Meteor.subscribe('users');
}
});
根据要求:请注意,这包括默认布局和加载模板的可选示例。加载模板将替换layoutTemplate{{>yield}}的内容,直到waitOn(全局和路由特定)订阅准备就绪。
我还收到了一个浏览器控制台错误,据我所知,这似乎不会阻碍任何事情,但我不喜欢它出现在那里:"调用方法"eventsOnLooksInit"时出错:找不到方法[404]"