Skip to content

Loading…

Fix $transaction - return promise #240

Closed
wants to merge 3 commits into from

3 participants

@mikepugh

$transaction method was not returning the deferred.promise object

@mikepugh

Updated pull request with $id property for issue #187

@leisms
Firebase member

@mikepugh nice! I'll try this out later today

@mikepugh

@leisms - I just updated the PR, removing the comment block

@anantn
Firebase member

Thanks @mikepugh - fixed by 0c5a4d9

@anantn anantn closed this
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Feb 2, 2014
  1. @mikepugh

    Fix - return promise

    mikepugh committed
Commits on Feb 9, 2014
  1. @mikepugh

    Adding property

    mikepugh committed
Commits on Feb 11, 2014
  1. @mikepugh
Showing with 23 additions and 2 deletions.
  1. +5 −0 angularfire.js
  2. +1 −1 angularfire.min.js
  3. +5 −1 tests/e2e/test_chat.html
  4. +12 −0 tests/e2e/test_chat.js
View
5 angularfire.js
@@ -143,6 +143,9 @@
var self = this;
var object = {};
+ // Set the $id val equal to the firebase reference's name() function
+ object.$id = self._fRef.ref().name();
+
// Establish a 3-way data binding (implicit sync) with the specified
// Firebase location and a model on $scope. To be used from a controller
// to automatically synchronize *all* local changes. It take three
@@ -278,6 +281,8 @@
}
},
applyLocally);
+
+ return deferred.promise;
};
// Remove this object from the remote data. Calling this is the
View
2 angularfire.min.js
@@ -1 +1 @@
-"use strict";!function(){var a,b;angular.module("firebase",[]).value("Firebase",Firebase),angular.module("firebase").factory("$firebase",["$q","$parse","$timeout",function(b,c,d){return function(e){var f=new a(b,c,d,e);return f.construct()}}]),angular.module("firebase").filter("orderByPriority",function(){return function(a){if(!a)return[];if(!a.$getIndex||"function"!=typeof a.$getIndex){var b=Object.prototype.toString.call(a);if("object"==typeof a&&"[object Object]"==b){var c=[];for(var d in a)a.hasOwnProperty(d)&&c.push(a[d]);return c}return a}var e=[],f=a.$getIndex();if(f.length<=0)return a;for(var g=0;g<f.length;g++){var h=a[f[g]];h&&(h.$id=f[g],e.push(h))}return e}}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a,b){if(void 0===this||null===this)throw new TypeError("'this' is null or not defined");var c=this.length>>>0;for(b=+b||0,1/0===Math.abs(b)&&(b=0),0>b&&(b+=c,0>b&&(b=0));c>b;b++)if(this[b]===a)return b;return-1}),a=function(a,b,c,d){if(this._q=a,this._bound=!1,this._loaded=!1,this._parse=b,this._timeout=c,this._index=[],this._on={value:[],change:[],loaded:[],child_added:[],child_moved:[],child_changed:[],child_removed:[]},"string"==typeof d)throw new Error("Please provide a Firebase reference instead of a URL, eg: new Firebase(url)");this._fRef=d},a.prototype={construct:function(){var b=this,c={};return c.$bind=function(a,c,d){return b._bind(a,c,d)},c.$add=function(a){function c(a){a?e.reject(a):e.resolve(d)}var d,e=b._q.defer();return d="object"==typeof a?b._fRef.ref().push(b._parseObject(a),c):b._fRef.ref().push(a,c),e.promise},c.$save=function(a){function c(a){a?d.reject(a):d.resolve()}var d=b._q.defer();if(a){var e=b._parseObject(b._object[a]);b._fRef.ref().child(a).set(e,c)}else b._fRef.ref().set(b._parseObject(b._object),c);return d.promise},c.$set=function(a){var c=b._q.defer();return b._fRef.ref().set(a,function(a){a?c.reject(a):c.resolve()}),c.promise},c.$transaction=function(a,c){var d=b._q.defer();b._fRef.ref().transaction(a,function(a,b,c){a?d.reject(a):b?d.resolve(c):d.resolve(null)},c)},c.$remove=function(a){function c(a){a?d.reject(a):d.resolve()}var d=b._q.defer();return a?b._fRef.ref().child(a).remove(c):b._fRef.ref().remove(c),d.promise},c.$child=function(c){var d=new a(b._q,b._parse,b._timeout,b._fRef.ref().child(c));return d.construct()},c.$on=function(a,c){if("loaded"==a&&b._loaded)return b._timeout(function(){c()}),void 0;if(!b._on.hasOwnProperty(a))throw new Error("Invalid event type "+a+" specified");b._on[a].push(c)},c.$off=function(a,c){if(b._on.hasOwnProperty(a))if(c){var d=b._on[a].indexOf(c);-1!==d&&b._on[a].splice(d,1)}else b._on[a]=[];else b._fRef.off()},c.$auth=function(a){var c=b._q.defer();return b._fRef.auth(a,function(a,b){null!==a?c.reject(a):c.resolve(b)},function(a){c.reject(a)}),c.promise},c.$getIndex=function(){return angular.copy(b._index)},b._object=c,b._getInitialValue(),b._object},_getInitialValue:function(){var a=this,b=function(c){var d=c.val();if(null===d&&a._bound){var e=a._parseObject(a._parse(a._name)(a._scope));switch(typeof e){case"string":case"undefined":d="";break;case"number":d=0;break;case"boolean":d=!1}}switch(typeof d){case"string":case"number":case"boolean":a._updatePrimitive(d);break;case"object":a._getChildValues(),a._fRef.off("value",b);break;default:throw new Error("Unexpected type from remote data "+typeof d)}a._loaded=!0,a._broadcastEvent("loaded",d)};a._fRef.on("value",b)},_getChildValues:function(){function a(a,b){var c=a.name(),e=a.val(),f=d._index.indexOf(c);if(-1!==f&&d._index.splice(f,1),b){var g=d._index.indexOf(b);d._index.splice(g+1,0,c)}else d._index.unshift(c);null!==a.getPriority()&&(e.$priority=a.getPriority()),d._updateModel(c,e)}function b(a,b){return function(c,e){b(c,e),d._broadcastEvent(a,{snapshot:{name:c.name(),value:c.val()},prevChild:e})}}function c(a,c){d._fRef.on(a,b(a,c))}var d=this;c("child_added",a),c("child_moved",a),c("child_changed",a),c("child_removed",function(a){var b=a.name(),c=d._index.indexOf(b);d._index.splice(c,1),d._updateModel(b,null)})},_updateModel:function(a,b){var c=this;c._timeout(function(){if(null==b?delete c._object[a]:c._object[a]=b,c._broadcastEvent("change",a),c._bound){var d=c._object,e=c._parse(c._name)(c._scope);angular.equals(d,e)||c._parse(c._name).assign(c._scope,angular.copy(d))}})},_updatePrimitive:function(a){var b=this;b._timeout(function(){if(b._object.$value&&angular.equals(b._object.$value,a)||(b._object.$value=a),b._broadcastEvent("change"),b._bound){var c=b._parseObject(b._parse(b._name)(b._scope));angular.equals(c,a)||b._parse(b._name).assign(b._scope,a)}})},_broadcastEvent:function(a,b){function c(a,b){e._timeout(function(){a(b)})}var d=this._on[a]||[],e=this;if(d.length>0)for(var f=0;f<d.length;f++)"function"==typeof d[f]&&c(d[f],b)},_bind:function(a,b,c){var d=this,e=d._q.defer();d._name=b,d._bound=!0,d._scope=a;var f=d._parse(b)(a);void 0!==f&&"object"==typeof f&&d._fRef.update(d._parseObject(f));var g=a.$watch(b,function(){var c=d._parseObject(d._parse(b)(a));d._object.$value&&angular.equals(c,d._object.$value)||angular.equals(c,d._object)||void 0!==c&&d._loaded&&(d._fRef.set?d._fRef.set(c):d._fRef.ref().update(c))},!0);return a.$on("$destroy",function(){g()}),d._fRef.once("value",function(f){d._timeout(function(){"object"!=typeof f.val()?(null==f.val()&&"function"==typeof c&&(a[b]=c()),e.resolve(g)):d._timeout(function(){null==f.val()&&"function"==typeof c&&(a[b]=c()),e.resolve(g)})})}),e.promise},_parseObject:function(a){function b(a){for(var c in a)a.hasOwnProperty(c)&&("$priority"==c?(a[".priority"]=a.$priority,delete a.$priority):"object"==typeof a[c]&&b(a[c]));return a}var c=b(angular.copy(a));return angular.fromJson(angular.toJson(c))}},angular.module("firebase").factory("$firebaseSimpleLogin",["$q","$timeout","$rootScope",function(a,c,d){return function(e){var f=new b(a,c,d,e);return f.construct()}}]),b=function(a,b,c,d){if(this._q=a,this._timeout=b,this._rootScope=c,this._loginDeferred=null,this._getCurrentUserDeferred=[],this._currentUserData=void 0,"string"==typeof d)throw new Error("Please provide a Firebase reference instead of a URL, eg: new Firebase(url)");this._fRef=d},b.prototype={construct:function(){var a={user:null,$login:this.login.bind(this),$logout:this.logout.bind(this),$createUser:this.createUser.bind(this),$changePassword:this.changePassword.bind(this),$removeUser:this.removeUser.bind(this),$getCurrentUser:this.getCurrentUser.bind(this),$sendPasswordResetEmail:this.sendPasswordResetEmail.bind(this)};if(this._object=a,!window.FirebaseSimpleLogin){var b=new Error("FirebaseSimpleLogin is undefined. Did you forget to include firebase-simple-login.js?");throw this._rootScope.$broadcast("$firebaseSimpleLogin:error",b),b}var c=new FirebaseSimpleLogin(this._fRef,this._onLoginEvent.bind(this));return this._authClient=c,this._object},login:function(a,b){var c=this._q.defer(),d=this;return this.getCurrentUser().then(function(){d._loginDeferred=c,d._authClient.login(a,b)}),c.promise},logout:function(){this._authClient.logout(),delete this._currentUserData},createUser:function(a,b,c){var d=this,e=this._q.defer();return d._authClient.createUser(a,b,function(f,g){f?(d._rootScope.$broadcast("$firebaseSimpleLogin:error",f),e.reject(f)):c?e.resolve(g):e.resolve(d.login("password",{email:a,password:b}))}),e.promise},changePassword:function(a,b,c){var d=this,e=this._q.defer();return d._authClient.changePassword(a,b,c,function(a){a?(d._rootScope.$broadcast("$firebaseSimpleLogin:error",a),e.reject(a)):e.resolve()}),e.promise},getCurrentUser:function(){var a=this,b=this._q.defer();return void 0!==a._currentUserData?b.resolve(a._currentUserData):a._getCurrentUserDeferred.push(b),b.promise},removeUser:function(a,b){var c=this,d=this._q.defer();return c._authClient.removeUser(a,b,function(a){a?(c._rootScope.$broadcast("$firebaseSimpleLogin:error",a),d.reject(a)):d.resolve()}),d.promise},sendPasswordResetEmail:function(a){var b=this,c=this._q.defer();return b._authClient.sendPasswordResetEmail(a,function(a){a?(b._rootScope.$broadcast("$firebaseSimpleLogin:error",a),c.reject(a)):c.resolve()}),c.promise},_onLoginEvent:function(a,b){if(this._currentUserData!==b||null!==a){var c=this;a?(c._loginDeferred&&(c._loginDeferred.reject(a),c._loginDeferred=null),c._rootScope.$broadcast("$firebaseSimpleLogin:error",a)):(this._currentUserData=b,c._timeout(function(){for(c._object.user=b,b?c._rootScope.$broadcast("$firebaseSimpleLogin:login",b):c._rootScope.$broadcast("$firebaseSimpleLogin:logout"),c._loginDeferred&&(c._loginDeferred.resolve(b),c._loginDeferred=null);c._getCurrentUserDeferred.length>0;){var a=c._getCurrentUserDeferred.pop();a.resolve(b)}}))}}}}();
+"use strict";!function(){var a,b;angular.module("firebase",[]).value("Firebase",Firebase),angular.module("firebase").factory("$firebase",["$q","$parse","$timeout",function(b,c,d){return function(e){var f=new a(b,c,d,e);return f.construct()}}]),angular.module("firebase").filter("orderByPriority",function(){return function(a){if(!a)return[];if(!a.$getIndex||"function"!=typeof a.$getIndex){var b=Object.prototype.toString.call(a);if("object"==typeof a&&"[object Object]"==b){var c=[];for(var d in a)a.hasOwnProperty(d)&&c.push(a[d]);return c}return a}var e=[],f=a.$getIndex();if(f.length<=0)return a;for(var g=0;g<f.length;g++){var h=a[f[g]];h&&(h.$id=f[g],e.push(h))}return e}}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a,b){if(void 0===this||null===this)throw new TypeError("'this' is null or not defined");var c=this.length>>>0;for(b=+b||0,1/0===Math.abs(b)&&(b=0),0>b&&(b+=c,0>b&&(b=0));c>b;b++)if(this[b]===a)return b;return-1}),a=function(a,b,c,d){if(this._q=a,this._bound=!1,this._loaded=!1,this._parse=b,this._timeout=c,this._index=[],this._on={value:[],change:[],loaded:[],child_added:[],child_moved:[],child_changed:[],child_removed:[]},"string"==typeof d)throw new Error("Please provide a Firebase reference instead of a URL, eg: new Firebase(url)");this._fRef=d},a.prototype={construct:function(){var b=this,c={};return c.$id=b._fRef.ref().name(),c.$bind=function(a,c,d){return b._bind(a,c,d)},c.$add=function(a){function c(a){a?e.reject(a):e.resolve(d)}var d,e=b._q.defer();return d="object"==typeof a?b._fRef.ref().push(b._parseObject(a),c):b._fRef.ref().push(a,c),e.promise},c.$save=function(a){function c(a){a?d.reject(a):d.resolve()}var d=b._q.defer();if(a){var e=b._parseObject(b._object[a]);b._fRef.ref().child(a).set(e,c)}else b._fRef.ref().set(b._parseObject(b._object),c);return d.promise},c.$set=function(a){var c=b._q.defer();return b._fRef.ref().set(a,function(a){a?c.reject(a):c.resolve()}),c.promise},c.$transaction=function(a,c){var d=b._q.defer();return b._fRef.ref().transaction(a,function(a,b,c){a?d.reject(a):d.resolve(b?c:null)},c),d.promise},c.$remove=function(a){function c(a){a?d.reject(a):d.resolve()}var d=b._q.defer();return a?b._fRef.ref().child(a).remove(c):b._fRef.ref().remove(c),d.promise},c.$child=function(c){var d=new a(b._q,b._parse,b._timeout,b._fRef.ref().child(c));return d.construct()},c.$on=function(a,c){if("loaded"==a&&b._loaded)return void b._timeout(function(){c()});if(!b._on.hasOwnProperty(a))throw new Error("Invalid event type "+a+" specified");b._on[a].push(c)},c.$off=function(a,c){if(b._on.hasOwnProperty(a))if(c){var d=b._on[a].indexOf(c);-1!==d&&b._on[a].splice(d,1)}else b._on[a]=[];else b._fRef.off()},c.$auth=function(a){var c=b._q.defer();return b._fRef.auth(a,function(a,b){null!==a?c.reject(a):c.resolve(b)},function(a){c.reject(a)}),c.promise},c.$getIndex=function(){return angular.copy(b._index)},b._object=c,b._getInitialValue(),b._object},_getInitialValue:function(){var a=this,b=function(c){var d=c.val();if(null===d&&a._bound){var e=a._parseObject(a._parse(a._name)(a._scope));switch(typeof e){case"string":case"undefined":d="";break;case"number":d=0;break;case"boolean":d=!1}}switch(typeof d){case"string":case"number":case"boolean":a._updatePrimitive(d);break;case"object":a._getChildValues(),a._fRef.off("value",b);break;default:throw new Error("Unexpected type from remote data "+typeof d)}a._loaded=!0,a._broadcastEvent("loaded",d)};a._fRef.on("value",b)},_getChildValues:function(){function a(a,b){var c=a.name(),e=a.val(),f=d._index.indexOf(c);if(-1!==f&&d._index.splice(f,1),b){var g=d._index.indexOf(b);d._index.splice(g+1,0,c)}else d._index.unshift(c);null!==a.getPriority()&&(e.$priority=a.getPriority()),d._updateModel(c,e)}function b(a,b){return function(c,e){b(c,e),d._broadcastEvent(a,{snapshot:{name:c.name(),value:c.val()},prevChild:e})}}function c(a,c){d._fRef.on(a,b(a,c))}var d=this;c("child_added",a),c("child_moved",a),c("child_changed",a),c("child_removed",function(a){var b=a.name(),c=d._index.indexOf(b);d._index.splice(c,1),d._updateModel(b,null)})},_updateModel:function(a,b){var c=this;c._timeout(function(){if(null==b?delete c._object[a]:c._object[a]=b,c._broadcastEvent("change",a),c._bound){var d=c._object,e=c._parse(c._name)(c._scope);angular.equals(d,e)||c._parse(c._name).assign(c._scope,angular.copy(d))}})},_updatePrimitive:function(a){var b=this;b._timeout(function(){if(b._object.$value&&angular.equals(b._object.$value,a)||(b._object.$value=a),b._broadcastEvent("change"),b._bound){var c=b._parseObject(b._parse(b._name)(b._scope));angular.equals(c,a)||b._parse(b._name).assign(b._scope,a)}})},_broadcastEvent:function(a,b){function c(a,b){e._timeout(function(){a(b)})}var d=this._on[a]||[],e=this;if(d.length>0)for(var f=0;f<d.length;f++)"function"==typeof d[f]&&c(d[f],b)},_bind:function(a,b,c){var d=this,e=d._q.defer();d._name=b,d._bound=!0,d._scope=a;var f=d._parse(b)(a);void 0!==f&&"object"==typeof f&&d._fRef.update(d._parseObject(f));var g=a.$watch(b,function(){var c=d._parseObject(d._parse(b)(a));d._object.$value&&angular.equals(c,d._object.$value)||angular.equals(c,d._object)||void 0!==c&&d._loaded&&(d._fRef.set?d._fRef.set(c):d._fRef.ref().update(c))},!0);return a.$on("$destroy",function(){g()}),d._fRef.once("value",function(f){d._timeout(function(){"object"!=typeof f.val()?(null==f.val()&&"function"==typeof c&&(a[b]=c()),e.resolve(g)):d._timeout(function(){null==f.val()&&"function"==typeof c&&(a[b]=c()),e.resolve(g)})})}),e.promise},_parseObject:function(a){function b(a){for(var c in a)a.hasOwnProperty(c)&&("$priority"==c?(a[".priority"]=a.$priority,delete a.$priority):"object"==typeof a[c]&&b(a[c]));return a}var c=b(angular.copy(a));return angular.fromJson(angular.toJson(c))}},angular.module("firebase").factory("$firebaseSimpleLogin",["$q","$timeout","$rootScope",function(a,c,d){return function(e){var f=new b(a,c,d,e);return f.construct()}}]),b=function(a,b,c,d){if(this._q=a,this._timeout=b,this._rootScope=c,this._loginDeferred=null,this._getCurrentUserDeferred=[],this._currentUserData=void 0,"string"==typeof d)throw new Error("Please provide a Firebase reference instead of a URL, eg: new Firebase(url)");this._fRef=d},b.prototype={construct:function(){var a={user:null,$login:this.login.bind(this),$logout:this.logout.bind(this),$createUser:this.createUser.bind(this),$changePassword:this.changePassword.bind(this),$removeUser:this.removeUser.bind(this),$getCurrentUser:this.getCurrentUser.bind(this),$sendPasswordResetEmail:this.sendPasswordResetEmail.bind(this)};if(this._object=a,!window.FirebaseSimpleLogin){var b=new Error("FirebaseSimpleLogin is undefined. Did you forget to include firebase-simple-login.js?");throw this._rootScope.$broadcast("$firebaseSimpleLogin:error",b),b}var c=new FirebaseSimpleLogin(this._fRef,this._onLoginEvent.bind(this));return this._authClient=c,this._object},login:function(a,b){var c=this._q.defer(),d=this;return this.getCurrentUser().then(function(){d._loginDeferred=c,d._authClient.login(a,b)}),c.promise},logout:function(){this._authClient.logout(),delete this._currentUserData},createUser:function(a,b,c){var d=this,e=this._q.defer();return d._authClient.createUser(a,b,function(f,g){f?(d._rootScope.$broadcast("$firebaseSimpleLogin:error",f),e.reject(f)):e.resolve(c?g:d.login("password",{email:a,password:b}))}),e.promise},changePassword:function(a,b,c){var d=this,e=this._q.defer();return d._authClient.changePassword(a,b,c,function(a){a?(d._rootScope.$broadcast("$firebaseSimpleLogin:error",a),e.reject(a)):e.resolve()}),e.promise},getCurrentUser:function(){var a=this,b=this._q.defer();return void 0!==a._currentUserData?b.resolve(a._currentUserData):a._getCurrentUserDeferred.push(b),b.promise},removeUser:function(a,b){var c=this,d=this._q.defer();return c._authClient.removeUser(a,b,function(a){a?(c._rootScope.$broadcast("$firebaseSimpleLogin:error",a),d.reject(a)):d.resolve()}),d.promise},sendPasswordResetEmail:function(a){var b=this,c=this._q.defer();return b._authClient.sendPasswordResetEmail(a,function(a){a?(b._rootScope.$broadcast("$firebaseSimpleLogin:error",a),c.reject(a)):c.resolve()}),c.promise},_onLoginEvent:function(a,b){if(this._currentUserData!==b||null!==a){var c=this;a?(c._loginDeferred&&(c._loginDeferred.reject(a),c._loginDeferred=null),c._rootScope.$broadcast("$firebaseSimpleLogin:error",a)):(this._currentUserData=b,c._timeout(function(){for(c._object.user=b,b?c._rootScope.$broadcast("$firebaseSimpleLogin:login",b):c._rootScope.$broadcast("$firebaseSimpleLogin:logout"),c._loginDeferred&&(c._loginDeferred.resolve(b),c._loginDeferred=null);c._getCurrentUserDeferred.length>0;){var a=c._getCurrentUserDeferred.pop();a.resolve(b)}}))}}}}();
View
6 tests/e2e/test_chat.html
@@ -46,7 +46,11 @@
} else {
return currentCount+1;
}
- });
+ }).then(function(snapshot) {
+ var val = snapshot.val();
+ }, function(err) {
+
+ });
$scope.message = "";
return promise;
View
12 tests/e2e/test_chat.js
@@ -118,6 +118,18 @@ casper.then(function() {
}, "Testing if $add, $set, $save and $remove return a promise");
});
+casper.then(function() {
+ this.test.assertEval(function() {
+ _scope.message = "Testing $id value";
+
+ var id = _scope.messages.$id;
+ var fbRef = new Firebase(_url);
+
+ if(id === fbRef.name()) { return true; }
+ return false;
+ }, "Testing if $id resolves to firebaseRef.name()");
+});
+
casper.run(function() {
this.test.done();
});
Something went wrong with that request. Please try again.