如何使用流星事件挂钩



我想显示当前在线的用户关注特殊页面的用户。在这个页面的某个地方,我喜欢显示用户列表和状态(在线/离线聚焦/无聚焦)

我发现了这个包: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]"

相关内容

  • 没有找到相关文章

最新更新