From 1f965bfedb4afd56da4880a4f830be438c4ea7c8 Mon Sep 17 00:00:00 2001 From: Raymond Feng Date: Fri, 20 Dec 2013 14:47:41 -0800 Subject: [PATCH 1/3] Fix the remoting method with the current receiver (this) --- lib/scope.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/scope.js b/lib/scope.js index e4672d5d..44513ddc 100644 --- a/lib/scope.js +++ b/lib/scope.js @@ -83,8 +83,8 @@ function defineScope(cls, targetClass, name, params, methods) { // Wrap the property into a function for remoting var fn = function() { - var f = this[name]; - f.apply(this, arguments); + var f = cls[name]; + f.apply(cls, arguments); }; fn.shared = true; @@ -96,8 +96,8 @@ function defineScope(cls, targetClass, name, params, methods) { cls['__get__' + name] = fn; var fn_create = function() { - var f = this[name].create; - f.apply(this, arguments); + var f = cls[name].create; + f.apply(cls[name], arguments); }; fn_create.shared = true; @@ -109,8 +109,8 @@ function defineScope(cls, targetClass, name, params, methods) { cls['__create__' + name] = fn_create; var fn_delete = function() { - var f = this[name].destroyAll; - f.apply(this, arguments); + var f = cls[name].destroyAll; + f.apply(cls[name], arguments); }; fn_delete.shared = true; fn_delete.http = {verb: 'delete', path: '/' + name}; From f1773857bb031fe95de818ab4384c094989c08fd Mon Sep 17 00:00:00 2001 From: Raymond Feng Date: Fri, 20 Dec 2013 17:28:21 -0800 Subject: [PATCH 2/3] Fix the remote delegation --- lib/relations.js | 4 +--- lib/scope.js | 15 ++++++++------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/lib/relations.js b/lib/relations.js index a5b043f4..65e98824 100644 --- a/lib/relations.js +++ b/lib/relations.js @@ -26,7 +26,7 @@ Relation.relationNameFor = function relationNameFor(foreignKey) { * @example `User.hasMany(Post, {as: 'posts', foreignKey: 'authorId'});` */ Relation.hasMany = function hasMany(anotherClass, params) { - var thisClass = this, thisClassName = this.modelName; + var thisClassName = this.modelName; params = params || {}; if (typeof anotherClass === 'string') { params.as = anotherClass; @@ -71,7 +71,6 @@ Relation.hasMany = function hasMany(anotherClass, params) { done = function() {}; } var self = this; - var id = this[idName]; anotherClass.create(data, function(err, ac) { if (err) return done(err, ac); var d = {}; @@ -98,7 +97,6 @@ Relation.hasMany = function hasMany(anotherClass, params) { params.through.findOrCreate({where: query}, data, done); }; scopeMethods.remove = function(acInst, done) { - var self = this; var q = {}; q[fk2] = acInst[idName] || acInst; params.through.findOne({where: q}, function(err, d) { diff --git a/lib/scope.js b/lib/scope.js index 44513ddc..3094cc97 100644 --- a/lib/scope.js +++ b/lib/scope.js @@ -60,6 +60,7 @@ function defineScope(cls, targetClass, name, params, methods) { } }; f._scope = typeof params === 'function' ? params.call(this) : params; + f.build = build; f.create = create; f.destroyAll = destroyAll; @@ -83,8 +84,8 @@ function defineScope(cls, targetClass, name, params, methods) { // Wrap the property into a function for remoting var fn = function() { - var f = cls[name]; - f.apply(cls, arguments); + var f = this[name]; + f.apply(this[name], arguments); }; fn.shared = true; @@ -96,21 +97,21 @@ function defineScope(cls, targetClass, name, params, methods) { cls['__get__' + name] = fn; var fn_create = function() { - var f = cls[name].create; - f.apply(cls[name], arguments); + var f = this[name].create; + f.apply(this[name], arguments); }; fn_create.shared = true; fn_create.http = {verb: 'post', path: '/' + name}; - fn_create.accepts = {arg: 'data', type: 'object', source: 'body'}; + fn_create.accepts = {arg: 'data', type: 'object', http: {source: 'body'}}; fn_create.description = 'Creates ' + name; fn_create.returns = {arg: 'data', type: 'object', root: true}; cls['__create__' + name] = fn_create; var fn_delete = function() { - var f = cls[name].destroyAll; - f.apply(cls[name], arguments); + var f = this[name].destroyAll; + f.apply(this[name], arguments); }; fn_delete.shared = true; fn_delete.http = {verb: 'delete', path: '/' + name}; From d9d9d82141d239d955f5414910b13f4fd98aed55 Mon Sep 17 00:00:00 2001 From: Raymond Feng Date: Fri, 20 Dec 2013 17:49:14 -0800 Subject: [PATCH 3/3] Add more comments --- lib/scope.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib/scope.js b/lib/scope.js index 3094cc97..c1e6a51d 100644 --- a/lib/scope.js +++ b/lib/scope.js @@ -24,6 +24,17 @@ function defineScope(cls, targetClass, name, params, methods) { Object.defineProperty(cls, name, { enumerable: false, configurable: true, + /** + * This defines a property for the scope. For example, user.accounts or + * User.vips. Please note the cls can be the model class or prototype of + * the model class. + * + * The property value is function. It can be used to query the scope, + * such as user.accounts(condOrRefresh, cb) or User.vips(cb). The value + * can also have child properties for create/build/delete. For example, + * user.accounts.create(act, cb). + * + */ get: function () { var f = function caller(condOrRefresh, cb) { var actualCond = {}; @@ -84,7 +95,9 @@ function defineScope(cls, targetClass, name, params, methods) { // Wrap the property into a function for remoting var fn = function() { + // primaryObject.scopeName, such as user.accounts var f = this[name]; + // set receiver to be the scope property whose value is a function f.apply(this[name], arguments); };