@@ -2501,6 +2501,10 @@ BaseConfig.prototype.beforeUpdate = lifecycleNoop;
2501
2501
BaseConfig . prototype . afterUpdate = lifecycleNoop ;
2502
2502
BaseConfig . prototype . beforeDestroy = lifecycleNoop ;
2503
2503
BaseConfig . prototype . afterDestroy = lifecycleNoop ;
2504
+ BaseConfig . prototype . beforeInject = function ( ) {
2505
+ } ;
2506
+ BaseConfig . prototype . afterInject = function ( ) {
2507
+ } ;
2504
2508
2505
2509
/**
2506
2510
* @doc function
@@ -2531,6 +2535,8 @@ function DSProvider() {
2531
2535
* - `{function}` - `afterUpdate` - See [](). Default: No-op
2532
2536
* - `{function}` - `beforeDestroy` - See [](). Default: No-op
2533
2537
* - `{function}` - `afterDestroy` - See [](). Default: No-op
2538
+ * - `{function}` - `beforeInject` - See [](). Default: No-op
2539
+ * - `{function}` - `afterInject` - See [](). Default: No-op
2534
2540
*/
2535
2541
var defaults = this . defaults = new BaseConfig ( ) ;
2536
2542
@@ -2892,6 +2898,10 @@ function Resource(utils, options) {
2892
2898
* - `{string="id"}` - `idAttribute` - The attribute that specifies the primary key for this resource.
2893
2899
* - `{string=}` - `endpoint` - The attribute that specifies the primary key for this resource. Default is the value of `name`.
2894
2900
* - `{string=}` - `baseUrl` - The url relative to which all AJAX requests will be made.
2901
+ * - `{object=}` - `methods` - If provided, items of this resource will be wrapped in a constructor function that is
2902
+ * empty save for the attributes in this option which will be mixed in to the constructor function prototype. Enabling
2903
+ * this feature for this resource will incur a slight performance penalty, but allows you to give custom behavior to what
2904
+ * are now "instances" of this resource.
2895
2905
* - `{function=}` - `beforeValidate` - Lifecycle hook. Overrides global. Signature: `beforeValidate(resourceName, attrs, cb)`. Callback signature: `cb(err, attrs)`.
2896
2906
* - `{function=}` - `validate` - Lifecycle hook. Overrides global. Signature: `validate(resourceName, attrs, cb)`. Callback signature: `cb(err, attrs)`.
2897
2907
* - `{function=}` - `afterValidate` - Lifecycle hook. Overrides global. Signature: `afterValidate(resourceName, attrs, cb)`. Callback signature: `cb(err, attrs)`.
@@ -2901,6 +2911,8 @@ function Resource(utils, options) {
2901
2911
* - `{function=}` - `afterUpdate` - Lifecycle hook. Overrides global. Signature: `afterUpdate(resourceName, attrs, cb)`. Callback signature: `cb(err, attrs)`.
2902
2912
* - `{function=}` - `beforeDestroy` - Lifecycle hook. Overrides global. Signature: `beforeDestroy(resourceName, attrs, cb)`. Callback signature: `cb(err, attrs)`.
2903
2913
* - `{function=}` - `afterDestroy` - Lifecycle hook. Overrides global. Signature: `afterDestroy(resourceName, attrs, cb)`. Callback signature: `cb(err, attrs)`.
2914
+ * - `{function=}` - `beforeInject` - Lifecycle hook. Overrides global. Signature: `beforeInject(resourceName, attrs)`.
2915
+ * - `{function=}` - `afterInject` - Lifecycle hook. Overrides global. Signature: `afterInject(resourceName, attrs)`.
2904
2916
*/
2905
2917
function defineResource ( definition ) {
2906
2918
if ( this . utils . isString ( definition ) ) {
@@ -2924,24 +2936,31 @@ function defineResource(definition) {
2924
2936
Resource . prototype = this . defaults ;
2925
2937
this . definitions [ definition . name ] = new Resource ( this . utils , definition ) ;
2926
2938
2927
- var _this = this ;
2939
+ var _this = this ,
2940
+ def = this . definitions [ definition . name ] ;
2928
2941
2929
- var cache = this . cacheFactory ( 'DS.' + definition . name , {
2930
- maxAge : definition . maxAge || null ,
2931
- recycleFreq : definition . recycleFreq || 1000 ,
2932
- cacheFlushInterval : definition . cacheFlushInterval || null ,
2933
- deleteOnExpire : definition . deleteOnExpire || 'none' ,
2942
+ var cache = this . cacheFactory ( 'DS.' + def . name , {
2943
+ maxAge : def . maxAge || null ,
2944
+ recycleFreq : def . recycleFreq || 1000 ,
2945
+ cacheFlushInterval : def . cacheFlushInterval || null ,
2946
+ deleteOnExpire : def . deleteOnExpire || 'none' ,
2934
2947
onExpire : function ( id ) {
2935
- _this . eject ( definition . name , id ) ;
2948
+ _this . eject ( def . name , id ) ;
2936
2949
} ,
2937
2950
capacity : Number . MAX_VALUE ,
2938
2951
storageMode : 'memory' ,
2939
2952
storageImpl : null ,
2940
2953
disabled : false ,
2941
- storagePrefix : 'DS.' + definition . name
2954
+ storagePrefix : 'DS.' + def . name
2942
2955
} ) ;
2943
2956
2944
- this . store [ definition . name ] = {
2957
+ if ( def . methods ) {
2958
+ def . factory = function ( ) {
2959
+ } ;
2960
+ this . utils . deepMixIn ( def . factory . prototype , def . methods ) ;
2961
+ }
2962
+
2963
+ this . store [ def . name ] = {
2945
2964
collection : [ ] ,
2946
2965
completedQueries : { } ,
2947
2966
pendingQueries : { } ,
@@ -3648,11 +3667,12 @@ function _inject(definition, resource, attrs) {
3648
3667
if ( ! ( definition . idAttribute in attrs ) ) {
3649
3668
throw new _this . errors . RuntimeError ( errorPrefix + 'attrs: Must contain the property specified by `idAttribute`!' ) ;
3650
3669
} else {
3670
+ definition . beforeInject ( definition . name , attrs ) ;
3651
3671
var id = attrs [ definition . idAttribute ] ,
3652
3672
item = this . get ( definition . name , id ) ;
3653
3673
3654
3674
if ( ! item ) {
3655
- item = { } ;
3675
+ item = definition . factory ? new definition . factory ( ) : { } ;
3656
3676
resource . previousAttributes [ id ] = { } ;
3657
3677
3658
3678
_this . utils . deepMixIn ( item , attrs ) ;
@@ -3676,6 +3696,7 @@ function _inject(definition, resource, attrs) {
3676
3696
resource . observers [ id ] . deliver ( ) ;
3677
3697
}
3678
3698
resource . saved [ id ] = _this . utils . updateTimestamp ( resource . saved [ id ] ) ;
3699
+ definition . afterInject ( definition . name , item ) ;
3679
3700
}
3680
3701
}
3681
3702
}
@@ -3748,7 +3769,11 @@ function inject(resourceName, attrs, options) {
3748
3769
} else {
3749
3770
_inject . apply ( _this , [ definition , resource , attrs ] ) ;
3750
3771
}
3751
- return attrs ;
3772
+ if ( _this . utils . isArray ( attrs ) ) {
3773
+ return attrs ;
3774
+ } else {
3775
+ return this . get ( resourceName , attrs [ definition . idAttribute ] ) ;
3776
+ }
3752
3777
} catch ( err ) {
3753
3778
if ( ! ( err instanceof this . errors . RuntimeError ) ) {
3754
3779
throw new this . errors . UnhandledError ( err ) ;
0 commit comments