From 33efab98d8cf528f469575315947711b87a1744c Mon Sep 17 00:00:00 2001 From: Hugo Miranda Mac Date: Thu, 14 Apr 2016 11:09:26 -0700 Subject: [PATCH 1/9] createStoreWith accepts either a function or an object with reducers --- src/components/ngRedux.js | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/components/ngRedux.js b/src/components/ngRedux.js index 314a9c0..56a5e88 100644 --- a/src/components/ngRedux.js +++ b/src/components/ngRedux.js @@ -1,22 +1,24 @@ import Connector from './connector'; import invariant from 'invariant'; -import {createStore, applyMiddleware, compose} from 'redux'; +import {createStore, applyMiddleware, compose, combineReducers} from 'redux'; import digestMiddleware from './digestMiddleware'; import assign from 'lodash.assign'; import isArray from 'lodash.isarray'; import isFunction from 'lodash.isfunction'; +import isObejct from 'lodash.isobject'; export default function ngReduxProvider() { let _reducer = undefined; let _middlewares = undefined; let _storeEnhancers = undefined; let _initialState = undefined; + let _reducerIsObejct = undefined; this.createStoreWith = (reducer, middlewares, storeEnhancers, initialState) => { invariant( - isFunction(reducer), - 'The reducer parameter passed to createStoreWith must be a Function. Instead received %s.', + isFunction(reducer) || isObejct(reducer), + 'The reducer parameter passed to createStoreWith must be a Function or an Object. Instead received %s.', typeof reducer ); @@ -27,6 +29,7 @@ export default function ngReduxProvider() { ); _reducer = reducer; + _reducerIsObejct = isObejct(reducer); _storeEnhancers = storeEnhancers _middlewares = middlewares || []; _initialState = initialState; @@ -43,6 +46,21 @@ export default function ngReduxProvider() { } } + if(_reducerIsObejct) { + let reducersObj = {}; + let reducKeys = Object.keys(_reducer); + + reducKeys.forEach((key) => { + if(typeof _reducer[key] === 'string') { + reducersObj[key] = $injector.get(_reducer[key]); + } else { + reducersObj[key] = _reducer[key]; + } + }); + + _reducer = combineReducers(reducersObj); + } + let finalCreateStore = _storeEnhancers ? compose(..._storeEnhancers)(createStore) : createStore; //digestMiddleware needs to be the last one. From 70bb76c4d752e57adf3448b7073a1545236d9e3d Mon Sep 17 00:00:00 2001 From: Hugo Miranda Mac Date: Thu, 14 Apr 2016 11:39:54 -0700 Subject: [PATCH 2/9] fixes object typo --- src/components/ngRedux.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/ngRedux.js b/src/components/ngRedux.js index 56a5e88..4801f91 100644 --- a/src/components/ngRedux.js +++ b/src/components/ngRedux.js @@ -6,18 +6,18 @@ import digestMiddleware from './digestMiddleware'; import assign from 'lodash.assign'; import isArray from 'lodash.isarray'; import isFunction from 'lodash.isfunction'; -import isObejct from 'lodash.isobject'; +import isObject from 'lodash.isobject'; export default function ngReduxProvider() { let _reducer = undefined; let _middlewares = undefined; let _storeEnhancers = undefined; let _initialState = undefined; - let _reducerIsObejct = undefined; + let _reducerIsObject = undefined; this.createStoreWith = (reducer, middlewares, storeEnhancers, initialState) => { invariant( - isFunction(reducer) || isObejct(reducer), + isFunction(reducer) || isObject(reducer), 'The reducer parameter passed to createStoreWith must be a Function or an Object. Instead received %s.', typeof reducer ); @@ -29,7 +29,7 @@ export default function ngReduxProvider() { ); _reducer = reducer; - _reducerIsObejct = isObejct(reducer); + _reducerIsObject = isObject(reducer); _storeEnhancers = storeEnhancers _middlewares = middlewares || []; _initialState = initialState; @@ -46,7 +46,7 @@ export default function ngReduxProvider() { } } - if(_reducerIsObejct) { + if(_reducerIsObject) { let reducersObj = {}; let reducKeys = Object.keys(_reducer); From 4099327eb635f84cf5edea77d31cca670f98fa9b Mon Sep 17 00:00:00 2001 From: Hugo Miranda Mac Date: Mon, 18 Apr 2016 16:56:08 -0700 Subject: [PATCH 3/9] update readme --- README.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/README.md b/README.md index 7fff021..d8ac824 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,10 @@ Add the following script tag to your html: #### Initialization +You can initialize ngRedux two ways: + +Function as the reducer argument for the `createStoreWith`: + ```JS import reducers from './reducers'; import { combineReducers } from 'redux'; @@ -54,6 +58,27 @@ angular.module('app', [ngRedux]) }); ``` +A reducer object as reducer argument for the `createStoreWith`: + +```JS +import reducers from './reducers'; +import { combineReducers } from 'redux'; +import loggingMiddleware from './loggingMiddleware'; +import ngRedux from 'ng-redux'; + +angular.module('app', [ngRedux]) +.config(($ngReduxProvider) => { + reducer3 = functtion(state, action){} + $ngReduxProvider.createStoreWith({ + reducer1: "reducer1", + reducer2: function(state, action){}, + reducer3: reducer3 + }, ['promiseMiddleware', loggingMiddleware]); + }); +``` + +The object can be constructed either by passing a function as value or a string representing the reducer. This way, you can create reducers as services and initialze them inside the `.config`. Behind the secnes, ngRedux will `$injector.get` the string you pass as the value for the ojects of reducers and initilaze it. + #### Usage *Using controllerAs syntax* From f7817055a8ea55a5c02b47cd75a8c191918c7b32 Mon Sep 17 00:00:00 2001 From: Hugo Miranda Mac Date: Wed, 20 Apr 2016 13:15:04 -0700 Subject: [PATCH 4/9] adds this.combineReducersFunc to ngReduxProvider --- src/components/ngRedux.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/components/ngRedux.js b/src/components/ngRedux.js index 4801f91..d42f9c1 100644 --- a/src/components/ngRedux.js +++ b/src/components/ngRedux.js @@ -14,6 +14,17 @@ export default function ngReduxProvider() { let _storeEnhancers = undefined; let _initialState = undefined; let _reducerIsObject = undefined; + let _combineReducers = undefined; + + this.combineReducersFunc = (func) => { + invariant( + isFunction(reducer), + 'The parameter passed to combineReducersFunc must be a Function. Instead received %s.', + typeof reducer + ); + + _combineReducers = func; + }; this.createStoreWith = (reducer, middlewares, storeEnhancers, initialState) => { invariant( @@ -37,6 +48,7 @@ export default function ngReduxProvider() { this.$get = ($injector) => { let store, resolvedMiddleware = []; + let finalCombineReducers = _combineReducers ? _combineReducers : combineReducers; for(let middleware of _middlewares) { if(typeof middleware === 'string') { @@ -58,7 +70,7 @@ export default function ngReduxProvider() { } }); - _reducer = combineReducers(reducersObj); + _reducer = finalCombineReducers(reducersObj); } let finalCreateStore = _storeEnhancers ? compose(..._storeEnhancers)(createStore) : createStore; From e37ca31b2844a27e31fae6ff08d7230ff9d244d3 Mon Sep 17 00:00:00 2001 From: Hugo Miranda Mac Date: Wed, 20 Apr 2016 13:36:56 -0700 Subject: [PATCH 5/9] update readme --- README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/README.md b/README.md index d8ac824..6718194 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,28 @@ angular.module('app', [ngRedux]) The object can be constructed either by passing a function as value or a string representing the reducer. This way, you can create reducers as services and initialze them inside the `.config`. Behind the secnes, ngRedux will `$injector.get` the string you pass as the value for the ojects of reducers and initilaze it. +You can also pass custom `combineReducers` to `$ngReduxProvider`, which is extremely helpfull if you want to use libraries such as [redux-immutable](https://github.com/gajus/redux-immutable) for example. + +```JS +import reducers from './reducers'; +import myCombineReducers from 'redux-immutable'; +import loggingMiddleware from './loggingMiddleware'; +import ngRedux from 'ng-redux'; + +angular.module('app', [ngRedux]) +.config(($ngReduxProvider) => { + $ngReduxProvider.combineReducersFunc(myCombineReducers); + reducer3 = functtion(state, action){} + $ngReduxProvider.createStoreWith({ + reducer1: "reducer1", + reducer2: function(state, action){}, + reducer3: reducer3 + }, ['promiseMiddleware', loggingMiddleware]); + }); +``` + +By passing `$ngReduxProvider.combineReducersFunc(myCombineReducers);`, ngRedux will use the new myCombineReducers function instead of the default one that comes with redux. + #### Usage *Using controllerAs syntax* From ef031c8fcb47084345367b5f44bfdb0ddbde7d12 Mon Sep 17 00:00:00 2001 From: Hugo Miranda Mac Date: Mon, 25 Apr 2016 09:02:39 -0700 Subject: [PATCH 6/9] change function name to setCombineReducersFunc --- README.md | 8 ++++---- src/components/ngRedux.js | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 6718194..fb41265 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ import ngRedux from 'ng-redux'; angular.module('app', [ngRedux]) .config(($ngReduxProvider) => { - reducer3 = functtion(state, action){} + reducer3 = function(state, action){} $ngReduxProvider.createStoreWith({ reducer1: "reducer1", reducer2: function(state, action){}, @@ -89,8 +89,8 @@ import ngRedux from 'ng-redux'; angular.module('app', [ngRedux]) .config(($ngReduxProvider) => { - $ngReduxProvider.combineReducersFunc(myCombineReducers); - reducer3 = functtion(state, action){} + $ngReduxProvider.setCombineReducersFunc(myCombineReducers); + reducer3 = function(state, action){} $ngReduxProvider.createStoreWith({ reducer1: "reducer1", reducer2: function(state, action){}, @@ -99,7 +99,7 @@ angular.module('app', [ngRedux]) }); ``` -By passing `$ngReduxProvider.combineReducersFunc(myCombineReducers);`, ngRedux will use the new myCombineReducers function instead of the default one that comes with redux. +By passing `$ngReduxProvider.setCombineReducersFunc(myCombineReducers);`, ngRedux will use the new myCombineReducers function instead of the default one that comes with redux. #### Usage diff --git a/src/components/ngRedux.js b/src/components/ngRedux.js index d42f9c1..a05ef2b 100644 --- a/src/components/ngRedux.js +++ b/src/components/ngRedux.js @@ -16,10 +16,10 @@ export default function ngReduxProvider() { let _reducerIsObject = undefined; let _combineReducers = undefined; - this.combineReducersFunc = (func) => { + this.setCombineReducersFunc = (func) => { invariant( isFunction(reducer), - 'The parameter passed to combineReducersFunc must be a Function. Instead received %s.', + 'The parameter passed to setCombineReducersFunc must be a Function. Instead received %s.', typeof reducer ); From 8c959c8b59394eb716cafe2303dc64fb8e210f24 Mon Sep 17 00:00:00 2001 From: Fire-Dragon-DoL Date: Tue, 26 Apr 2016 00:13:25 +0200 Subject: [PATCH 7/9] Added some files to gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index e849ca7..66a78bd 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ lib coverage *.tgz examples/**/dist +.envrc +.nvmrc From e56e3bddcd8567c208cbf1b8c418461b6d24c413 Mon Sep 17 00:00:00 2001 From: Fire-Dragon-DoL Date: Tue, 26 Apr 2016 00:41:06 +0200 Subject: [PATCH 8/9] Bump version --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 8a75f91..7dbc774 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "name": "ng-redux", + "version": "3.3.5-beta.0", "description": "Redux bindings for Angular.js", "main": "./lib/index.js", "scripts": { From 4b19aeae8d47a1b50176248440e912f64efd1ab4 Mon Sep 17 00:00:00 2001 From: Fire-Dragon-DoL Date: Tue, 26 Apr 2016 05:24:36 +0200 Subject: [PATCH 9/9] Fixed a typo with argument --- src/components/ngRedux.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/ngRedux.js b/src/components/ngRedux.js index a05ef2b..2682351 100644 --- a/src/components/ngRedux.js +++ b/src/components/ngRedux.js @@ -18,9 +18,9 @@ export default function ngReduxProvider() { this.setCombineReducersFunc = (func) => { invariant( - isFunction(reducer), + isFunction(func), 'The parameter passed to setCombineReducersFunc must be a Function. Instead received %s.', - typeof reducer + typeof func ); _combineReducers = func; @@ -60,14 +60,14 @@ export default function ngReduxProvider() { if(_reducerIsObject) { let reducersObj = {}; - let reducKeys = Object.keys(_reducer); + let reducKeys = Object.keys(_reducer); reducKeys.forEach((key) => { - if(typeof _reducer[key] === 'string') { + if(typeof _reducer[key] === 'string') { reducersObj[key] = $injector.get(_reducer[key]); } else { reducersObj[key] = _reducer[key]; - } + } }); _reducer = finalCombineReducers(reducersObj); @@ -78,7 +78,7 @@ export default function ngReduxProvider() { //digestMiddleware needs to be the last one. resolvedMiddleware.push(digestMiddleware($injector.get('$rootScope'))); - store = _initialState + store = _initialState ? applyMiddleware(...resolvedMiddleware)(finalCreateStore)(_reducer, _initialState) : applyMiddleware(...resolvedMiddleware)(finalCreateStore)(_reducer);