Skip to content

Commit

Permalink
Merge pull request #57 from janpantel/model-updater-off
Browse files Browse the repository at this point in the history
Fix(modelUpdater): Add ability to remove updater `on`
  • Loading branch information
TheSharpieOne committed Mar 19, 2015
2 parents 4447b7d + 24f987b commit 209df62
Show file tree
Hide file tree
Showing 7 changed files with 133 additions and 82 deletions.
2 changes: 1 addition & 1 deletion bower.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "angular-sails",
"version": "1.1.1",
"version": "1.1.2",
"authors": [
"Jan-Oliver Pantel <[email protected]>"
],
Expand Down
87 changes: 48 additions & 39 deletions dist/angular-sails.js
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ angular.module('ngSails', ['ng']);
socket._connect();
}
return socket;
}
};

// TODO: separate out interceptors into its own file (and provider?).
// build interceptor chain
Expand Down Expand Up @@ -247,49 +247,58 @@ angular.module('ngSails', ['ng']);
*/
socket.$modelUpdater = function(name, models) {

socket.on(name, function(message) {
var i;
var update = function(message) {

switch (message.verb) {
$rootScope.$evalAsync(function(){
var i;

case "created":
// create new model item
models.push(message.data);
break;
switch (message.verb) {

case "updated":
var obj;
for (i = 0; i < models.length; i++) {
if (models[i].id === message.id) {
obj = models[i];
break;
case "created":
// create new model item
models.push(message.data);
break;

case "updated":
var obj;
for (i = 0; i < models.length; i++) {
if (models[i].id === message.id) {
obj = models[i];
break;
}
}
}

// cant update if the angular-model does not have the item and the
// sails message does not give us the previous record
if (!obj && !message.previous) return;

if (!obj) {
// sails has given us the previous record, create it in our model
obj = message.previous;
models.push(obj);
}

// update the model item
angular.extend(obj, message.data);
break;

case "destroyed":
for (i = 0; i < models.length; i++) {
if (models[i].id === message.id) {
models.splice(i, 1);
break;

// cant update if the angular-model does not have the item and the
// sails message does not give us the previous record
if (!obj && !message.previous) return;

if (!obj) {
// sails has given us the previous record, create it in our model
obj = message.previous;
models.push(obj);
}
}
break;
}
});

// update the model item
angular.extend(obj, message.data);
break;

case "destroyed":
for (i = 0; i < models.length; i++) {
if (models[i].id === message.id) {
models.splice(i, 1);
break;
}
}
break;
}
});
};

socket.legacy_on(name, update);

return function(){
socket.legacy_off(name, update);
};
};

return socket;
Expand Down
2 changes: 1 addition & 1 deletion dist/angular-sails.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions mock/socket-io.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,16 @@ function createMockSocketObject() {
delete this._listeners[ev];
}
},
off: function(ev, fn) {
if (fn) {
var index = this._listeners[ev].indexOf(fn);
if (index > -1) {
this._listeners[ev].splice(index, 1);
}
} else {
delete this._listeners[ev];
}
},
removeAllListeners: function(ev) {
if (ev) {
delete this._listeners[ev];
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "angular-sails",
"private": true,
"version": "1.1.1",
"version": "1.1.2",
"description": "An angular provider for using the sails socket.io api",
"scripts": {
"build": "gulp build-js",
Expand Down
87 changes: 48 additions & 39 deletions src/service/angular-sails.js
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@
socket._connect();
}
return socket;
}
};

// TODO: separate out interceptors into its own file (and provider?).
// build interceptor chain
Expand Down Expand Up @@ -243,49 +243,58 @@
*/
socket.$modelUpdater = function(name, models) {

socket.on(name, function(message) {
var i;
var update = function(message) {

switch (message.verb) {
$rootScope.$evalAsync(function(){
var i;

case "created":
// create new model item
models.push(message.data);
break;
switch (message.verb) {

case "updated":
var obj;
for (i = 0; i < models.length; i++) {
if (models[i].id === message.id) {
obj = models[i];
break;
case "created":
// create new model item
models.push(message.data);
break;

case "updated":
var obj;
for (i = 0; i < models.length; i++) {
if (models[i].id === message.id) {
obj = models[i];
break;
}
}
}

// cant update if the angular-model does not have the item and the
// sails message does not give us the previous record
if (!obj && !message.previous) return;

if (!obj) {
// sails has given us the previous record, create it in our model
obj = message.previous;
models.push(obj);
}

// update the model item
angular.extend(obj, message.data);
break;

case "destroyed":
for (i = 0; i < models.length; i++) {
if (models[i].id === message.id) {
models.splice(i, 1);
break;

// cant update if the angular-model does not have the item and the
// sails message does not give us the previous record
if (!obj && !message.previous) return;

if (!obj) {
// sails has given us the previous record, create it in our model
obj = message.previous;
models.push(obj);
}
}
break;
}
});

// update the model item
angular.extend(obj, message.data);
break;

case "destroyed":
for (i = 0; i < models.length; i++) {
if (models[i].id === message.id) {
models.splice(i, 1);
break;
}
}
break;
}
});
};

socket.legacy_on(name, update);

return function(){
socket.legacy_off(name, update);
};
};

return socket;
Expand Down
25 changes: 24 additions & 1 deletion test/angular-sails-service.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -236,10 +236,11 @@ describe('Agnular Sails service', function() {

var models;
var modelResponse;
var removeUpdater;

beforeEach(function() {
models = [];
$sails.$modelUpdater('user', models);
removeUpdater = $sails.$modelUpdater('user', models);
modelResponse = {
created:{
data: {
Expand Down Expand Up @@ -295,6 +296,28 @@ describe('Agnular Sails service', function() {
expect(models[0].name).to.equal(modelResponse.updated.data.name);
});

describe('returned function', function(){
it('should remove the socket listener', function () {
removeUpdater();
$scope.$digest();
mockIoSocket.emit('user', modelResponse.created);
$scope.$digest();
expect(models).to.be.empty();
});

it('should remove only the socket listener it is called on', function () {
var tasks = [];
$sails.$modelUpdater('tasks', tasks);
removeUpdater();
$scope.$digest();
mockIoSocket.emit('user', modelResponse.created);
mockIoSocket.emit('tasks', modelResponse.created);
$scope.$digest();
expect(tasks).to.contain(modelResponse.created.data);
expect(models).to.be.empty();
});
});

});

});

0 comments on commit 209df62

Please sign in to comment.