-
-
Save amcdnl/f14cbfc3738668457ebb to your computer and use it in GitHub Desktop.
define(['angular'], function(angular){ | |
var module = angular.module('utils.cache', ['restmod') | |
// Cache implementation for angular-restmod | |
// https://github.com/platanus/angular-restmod/issues/27 | |
module.factory('CacheModel', function(restmod){ | |
var mixin = restmod.mixin(function() { | |
var cache = {}; | |
// Cache overrides | |
// ------------------------------------------------------------ | |
this.classDefine('$fetch', function() { | |
var url = this.$url(), | |
cached = cache[this.$url()]; | |
if(cached){ | |
return cached; | |
} else { | |
return cache[url] = this.$super.apply(this, arguments); | |
} | |
}); | |
this.classDefine('$find', function(_pk) { | |
var url = this.$urlFor(_pk), | |
cached = cache[url]; | |
if(cached){ | |
return cached; | |
} else { | |
return cache[url] = this.$super.apply(this, arguments); | |
} | |
}); | |
// set a pointer for cache | |
this.classDefine('$cache', cache); | |
}); | |
return mixin; | |
}); | |
return module; | |
}); |
@iobaixas - Singles should behave the same yes and no. For instance:
var model = $restmod.model("/api/zoo")
model.$search() //-> [ { id: 1, type: 'panda' }, .... ]
but if I do:
model.$find(1) //-> { id: 1, type: 'panda' }
I would think that it would pull the panda object out of the previous search collection so that you dont have multiple references.
Now the $single
that you mentioned above, should response just the same I agree.
@iobaixas - Is there a way to disableRenaming
at a global / provider level?
Ups, didn't see that last question, about that, I just realised that the README is missing provider usage directions, you can set a base model in the config stage like this:
module.config(function($restmodProvider) {
$restmodProvider.pushModelBase(function() { // Dont really like the name for this method, any thoughs?
this.disableRenaming():
});
});
About the new implementation, I will miss the local storage support... Why aren't you caching single $fetch results?
To return results from $search
when doing a $find
with an id $search
returned you could do something like
this.on('after-fetch-many', function(xhr){
cache[this.$url()] = this;
angular.forEach(this, function(record) {
cache[record.$url()] = record;
});
});
@kenborge - Ya I thought about something like that. Managing the list(s) and singles together gets tricky.
About the
$singles
fetch, shouldn't it behave the same as any other fetch?About the renaming, by default restmod does a underscore -> camelcase name conversion on decode and a camelcase -> underscore conversion on encode. Renaming can be disabled using the disableRenaming() builder method. What kind of issues are you having?
I missed the
after-save
hook when I reviewed the code earlier today, some feedback: