Skip to content

Instantly share code, notes, and snippets.

@coderberry
Created October 27, 2014 15:09
Show Gist options
  • Save coderberry/97095aec809668c4ef63 to your computer and use it in GitHub Desktop.
Save coderberry/97095aec809668c4ef63 to your computer and use it in GitHub Desktop.
createStore
var EventEmitter = require('events').EventEmitter
, mergeInto = require('react/lib/mergeInto');
function createStore(initialState) {
var events = new EventEmitter();
var state = initialState || {};
return {
setState: function(newState) {
mergeInto(state, newState);
this.emitChange();
},
set: function(attr, val) {
state[attr] = val;
},
get: function(attr) {
return state[attr];
},
getState: function() {
return state;
},
addChangeListener: function (listener) {
events.on('change', listener);
},
removeChangeListener: function (listener) {
events.removeListener('change', listener);
},
emitChange: function() {
events.emit('change');
}
};
};
module.exports = createStore;
var createStore = require('../createStore');
describe('createStore', function () {
describe('#initialize', function() {
it('set data into store', function() {
var MyStore = createStore({name: 'Joe', age: 35});
assert(MyStore.get('name') === 'Joe');
assert(MyStore.get('age') === 35);
});
});
describe('#setState', function() {
it('sets the state and triggers an event emitter', function(done) {
var MyStore = createStore({name: 'Joe', age: 35});
var eventReceiver = function() {
assert(this.get('foo') === 'bar');
assert(this.get('baz') === 'bop');
assert(true, 'event was triggered');
done();
};
MyStore.addChangeListener(eventReceiver.bind(MyStore));
MyStore.setState({
foo: 'bar',
baz: 'bop'
});
})
});
});
@coderberry
Copy link
Author

Usage:

// creating the store
var createStore = require('../wherever/createStore');

var SomeStore = module.exports = createStore({
  users: [],
  whatever: false
});

// in a component

React.createClass({
  componentDidMount: function() {
    SomeStore.addChangeListener(this.onChange);
  }
});

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment