Light and extensible reactive application adapter between RxJS and virtual-dom
  • JavaScript 100%
Find a file
2015-09-23 11:26:19 +09:00
examples fix typo 2015-08-20 18:43:27 +09:00
plugins remove dependencies 2015-08-20 23:01:55 +09:00
action-state-stream.js fix comment 2015-08-20 18:30:57 +09:00
define.js first commit 2015-08-20 18:24:14 +09:00
index.js first commit 2015-08-20 18:24:14 +09:00
LICENSE add license 2015-08-20 18:35:22 +09:00
package.json update minor version 2015-09-22 09:12:14 +09:00
README.md modify readme 2015-09-23 11:26:19 +09:00

Inga

Summary

Inga is light and extensible reactive application adapter between RxJS and virtual-dom.

Install

npm install inga

Simple Example

var Inga = require("inga");

Inga.define({
  domRoot:"#app",
  dataSource:new Inga.ActionStateStream({
    initialState:{clickCount:0}
  }),
  virtualView:function(ctx){
    return h("button", {
      "ev-click":function(ev){
        ctx.action.emitUpdater(function(state){
          state.clickCount++;
        });
      }
    }, ctx.state.clickCount);
  }
});

Using plugin

You can combine some interesting stuff to state by adding plugins to data source.

var Inga = require("inga");

Inga.define({
  domRoot:"#app",
  dataSource:new Inga.ActionStateStream({
    initialState:{scrollPos:{x:0, y:0}},
    // plugin 'scroll-pos' combines 'scrollPos' to status object.
    plugins:[
      {module:require("inga/plugins/scroll-pos"), options:{combine:true}}
    ]
  }),
  virtualView:function(ctx){
    return h("div", [
      h("p", "x = " + ctx.state.scrollPos.x),
      h("p", "y = " + ctx.state.scrollPos.y)
    ]);
  }
});

About other plugin, see plugins directory.

Combine your own source

ActionStateStream has it's own default stream, but implementing combine action, you can extend it with your own source.

var Rx = require("rx");
var Inga = require("inga");

Inga.define({
  domRoot:"#app",
  dataSource:new Inga.ActionStateStream({
    initialState:{width:window.innerWidth},
    actions:{
      // extend default stream by your own source.
      combine:function(initial_state, upstream$){
        var width$ = new Rx.Observable.fromEvent(window, "resize")
          .debounce(250)
          .map(function(event){
          return window.innerWidth
        })
        .startWith(window.innerWidth);

        return upstream$.combineLatest(width$, function(state, width){
          state.width = width;
          return state;
        });
      }
    }
  }),
  virtualView:function(ctx){
    return h("p", "current window width = " + ctx.state.width);
  }
});

Do something after stream created.

If defined, action method is called after data source stream is defined.

var Inga = require("inga");

Inga.define({
  domRoot:"#app",
  dataSource:new Inga.ActionStateStream({
    initialState:{clickCount:0},
    actions:{
      // add subscriber for debug.
      action:function(initial_state, $upstream){
        $upstream.subscribe(function(state){
          console.log("current state:", state);
        });
      }
    }
  }),
  virtualView:function(ctx){
    return h("button", {
      "ev-click":function(ev){
        ctx.action.emitUpdater(function(state){
          state.clickCount++;
        });
      }
    }, ctx.state.clickCount);
  }
});

Other examples

See example directory.

License

MIT