Skip to content

Instantly share code, notes, and snippets.

@Sebmaster
Last active December 16, 2015 15:39
Show Gist options
  • Save Sebmaster/5457971 to your computer and use it in GitHub Desktop.
Save Sebmaster/5457971 to your computer and use it in GitHub Desktop.
Method to implement data-synchronization in angular.js via racer.js
var module = angular.module('racer.js', [], function ($provide) {
var setImmediate = window && window.setImmediate ? window.setImmediate : function (fn) {
setTimeout(fn, 0);
};
var racer = require('racer');
$provide.factory('racer', ['$http', '$q', '$rootScope', function ($http, $q, $rootScope) {
$http.get('/model').success(function (data) {
racer.init(data);
});
var def = $q.defer();
racer.on('ready', function (model) {
var operations = ['set', 'del', 'setNull', 'incr', 'push', 'unshift', 'insert', 'pop', 'shift', 'remove', 'move'];
for (var i = 0; i < operations.length; ++i) {
(function (i) {
// local changes
var op = model[operations[i]];
model[operations[i]] = function () {
var args = Array.prototype.slice.call(arguments);
var cb;
if (typeof args[args.length - 1] === 'function') {
cb = args.pop();
}
args[args.length] = function () {
if (cb) cb.apply(this, arguments);
setImmediate($rootScope.$apply.bind($rootScope));
};
op.apply(this, args);
};
// remote changes
model.on(operations[i], '*', setImmediate.bind(this, $rootScope.$apply.bind($rootScope)));
})(i);
}
def.resolve(model);
});
return def.promise;
}]);
});
var racer = require('racer');
var express = require('express');
var app = express();
var http = require('http');
var server = http.createServer(app);
racer.use(racer.logPlugin)
racer.use(require('racer-db-mongo'));
var store = racer.createStore({
listen: server,
db: {
type: 'Mongo',
uri: 'mongodb://<mongo url>'
}
});
app.use(express.static(__dirname + '/public'));
app.use(express.bodyParser());
app.get('/', function (req, res) {
res.sendfile(__dirname + '/public/index.htm');
});
app.get('/model', function (req, res) {
var model = store.createModel();
model.subscribe('entries', function (err, entries) { // entries is a collection to subscribe to
if (err) {
res.status(500);
res.send(err);
} else {
model.bundle(function (bundle) {
res.send(bundle.toString());
});
}
});
});
racer.js({ entry: __dirname + '/client.js' }, function (err, js) {
app.get('/script.js', function (req, res) {
res.type('js');
res.send(js);
});
});
server.listen(8081);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment