npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

ember-multiton-service

v0.1.5

Published

When a single instance isn't enough.

Downloads

26

Readme

npm version Build Status

ember-multiton-service

Of the core Ember objects, Ember.Service is perhaps the simplest. Check it out; it's just a plain old Ember object. And yet for all its simplicity, it's also one of the most useful, providing a clean way to both encapsulate state and share it across your application.

The problem is, you can only have one instance of a service in your application; it's a singleton. And although this is typcially more than enough when using services to manage application state, it falls short for managing the states of associated components.

This became apparent while I was working on the Affinity Engine, an Ember-based game engine that leans heavily on services to manage state between (sometimes) hundreds of components. If there were only one Affinity Engine per Ember app, singleton services could handle this perfectly. But what if you wanted multiple engines? Then those singleton services would start getting conflicting states from each engine, leading to some horrible bugs.

In cases like these, we need something more flexible. Enter . . . ember-multiton-service!!!

To get it working for your own app, simply replace Ember.inject.service('my-service') with multiton('my-service', 'someKey'). And then you're done!

Installation

ember install ember-multiton-service

Usage

Use the multiton macro instead of Ember.inject.service, and provide it with however many keys you need:

import Ember from 'ember';
import multiton from 'ember-multiton-service';

export default Ember.Component.extend({
  // cart: Ember.inject.service('shopping-cart'),
  cart: multiton('shopping-cart', 'section', 'aisle')
});

Keys

You'll notice that in the above scenario we pass three values into multiton. The first is the name of the service, just like what we would pass into Ember.inject.service. The second two are keys that we bind the service to. You could provide any number of keys to get the level of specifity you need. When injecting the service, ember-multiton-service will check to see if any other instances exist with those keys. If so, it simply returns it. If not, it creates a new one.

To illustrate, let's consider that component from the last example:

{{cart-toggle section="food" aisle="bulk"}}
{{cart-toggle section="food" aisle="produce"}}
{{cart-toggle section="hardware" aisle="crockpots"}}
{{cart-toggle section="food" aisle="bulk"}}

In the scenario above, the first and last components will share the same shopping-cart service, as both their multiton keys are the same. Meanwhile, each of the middle two components will have their own instance of the shopping-cart service, as their key combos are unique.