最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - What's a good way to handle flash notifications in meteor (with meteor-router)? - Stack Overflow

programmeradmin3浏览0评论

I am using meteor along with meteor-router for client and server side routing. I'm wondering what a good way to handle site notifications, specifically "flash" type ones.

In the global layout.html I can have a handlebars output a message if a "message" session variable is set, but the message shouldn't stick around once the app is routed to a new url with Meteor.Router.to().

What's a good solution to having "flash" notifications? Or, how can I automatically clear a session variable after routing to a new URL.

layout.html:

<head>
  <title>Meteor App</title>
</head>
<body>
  {{> global-layout}}
</body>

<template name="global-layout">
   {{#if message}}
      <div class="message">{{message}}</div>
   {{/if}}
   {{renderPage}}
</template>

then in layout.js

Template['global-layout'].message = function () {
  return Session.get('message');
};

I am using meteor along with meteor-router for client and server side routing. I'm wondering what a good way to handle site notifications, specifically "flash" type ones.

In the global layout.html I can have a handlebars output a message if a "message" session variable is set, but the message shouldn't stick around once the app is routed to a new url with Meteor.Router.to().

What's a good solution to having "flash" notifications? Or, how can I automatically clear a session variable after routing to a new URL.

layout.html:

<head>
  <title>Meteor App</title>
</head>
<body>
  {{> global-layout}}
</body>

<template name="global-layout">
   {{#if message}}
      <div class="message">{{message}}</div>
   {{/if}}
   {{renderPage}}
</template>

then in layout.js

Template['global-layout'].message = function () {
  return Session.get('message');
};
Share Improve this question asked Dec 29, 2012 at 23:43 DiogenesDiogenes 2,7673 gold badges26 silver badges27 bronze badges 3
  • I found this pull request and this repo, which appears to be the beginning of a solution, but there isn't documentation on displaying the notifications. – Diogenes Commented Dec 29, 2012 at 23:47
  • You should post your own solution as an answer, so it can be voted and mented upon. – Rahul Commented Dec 29, 2012 at 23:53
  • Ah that's just it. I haven't been able to get anything to work yet. That repo seems to have the right intent, but it doesn't show how to put the notifications on the template. I'll continue poking around with it. – Diogenes Commented Dec 30, 2012 at 0:26
Add a ment  | 

2 Answers 2

Reset to default 9

I'm using a Meteor.Router.filter for this. This filter will be applied to all routes, therefore all flashes will be cleared on all url changes.

routes.js

Meteor.Router.filters({
  // clearSeenMessages filter clears all seen messages. 
  // This filters is applied to all pages 
  clearSeenMessages: function (page) {
    flash.clear();
    return page;
  },
});

// applies to all pages
Meteor.Router.filter('clearSeenMessages');

Here's the rest of the implementaion, aspects were borrowed from telesc.pe

client/views/flashes/flash_item.html

    <template name="flashItem">
      {{#if show}}
        <div class="alert-box {{type}}">
          {{message}}
          <a class="close"  href="">&times;</a>
        </div>
      {{/if}}
    </template>

client/views/flashes/flash_item.js

// When the template is first created
Template.flashItem.created = function () {
  // Get the ID of the messsage
  var id = this.data._id;
  Meteor.setTimeout(function () {
    // mark the flash as "seen" after 100 milliseconds
    flash.Flashes.update(id, {$set: {seen: true}});
  }, 100);
}

client/views/flashes/flashes.html

<template name="flashes">
  {{#each flashes}}
    {{> flashItem}}
  {{/each}}
</template>

client/views/flashes/flashes.js

Template.flashes.flashes = function () {
  return flash.Flashes.find();
}

client/views/app.html

<body>
  <!-- add the flashes somewhere in the body -->
  {{> flashes}}
</body>

client/lib/flashes.js

// flashes provides an api for temporary flash messages stored in a
// client only collecion
var flash = flash || {};

(function (argument) {
  // Client only collection
  flash.Flashes = new Meteor.Collection(null);

  // create given a message and optional type creates a Flash message.
  flash.create = function (message, type) {
    type = (typeof type === 'undefined') ? 'error' : type;
    // Store errors in the 'Errors' local collection
    flash.Flashes.insert({message: message, type: type, seen: false, show: true});
  };

  // error is a helper function for creating error messages
  flash.error = function (message) {
    return flash.create(message, 'error');
  };

  // success is a helper function for creating success messages
  flash.success = function (message) {
    return flash.create(message, 'success');
  };

  // info is a helper function for creating info messages
  flash.info = function (message) {
    return flash.create(message, 'info');
  };

  // clear hides viewed message
  flash.clear = function () {
    flash.Flashes.update({seen: true}, {$set: {show: false}}, {multi: true});
  };
})();

Usage

flash.success('This is a success message');
flash.error('This is a error message');
flash.info('This is a info message');

You can now use the router-with-flash package available on atmosphere to handle flash notifications. If you use meteorite (which you should), you can do mrt add router-with-flash in the root directory of your project. Then, to display an alert you need to -

Meteor.Router.to("/", { alert: "Some alert..." });
Meteor.Router.notification("alert");

This will display the alert until the next call to Meteor.Router.to().

发布评论

评论列表(0)

  1. 暂无评论