0.1.5 • Published 7 years ago

ember-multiton-service v0.1.5

Weekly downloads
1
License
MIT
Repository
github
Last release
7 years ago

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.

0.1.5

7 years ago

0.1.4

7 years ago

0.1.3

7 years ago

0.1.2

7 years ago

0.1.1

8 years ago

0.1.0

8 years ago

0.0.7

8 years ago

0.0.6

8 years ago

0.0.5

8 years ago

0.0.4

8 years ago

0.0.3

8 years ago

0.0.2

8 years ago