$resource: enumerability of methods and properties, toJSON
#14637
Description
Do you want to request a feature or report a bug?
Feature.
What is the current behavior?
If I want to apply some transformations to a Resource
instance, I could encounter some nasty surprises:
Cat.get({id: catId}).$promise.then(cat => {
this.catDetails = doSomethingWithPairs(_.pairs(cat));
this.otherCatDetails = doSomethingElse(_.pairs(_.omit(cat, ["name", "$promise", "$resolved"])));
});
doSomethingWithPairs
receives an array of pairs that contains ["$promise", /*...*/]
and ["$resolved", /*...*/]
. doSomethingElse
contains entries for all instance methods (!) such as $get
, $query
, etc.
What is the expected behavior?
This is a weird interaction with Underscore defaults[1] that is not for Angular to fix. However, I do think that some things that could be improved:
- Make
$promise
and$resolved
non-enumerable properties ofResource
instances. - Make all
Resource
instance methods non-enumerable (a la ES6 classes). - Document the behavior of
Resource.prototype.toJSON
method.
The latter is the workaround I have used to get a "normal" object from a Resource
instance, although I would feel more confident if it were documented.
Other information (e.g. stacktraces, related issues, suggestions how to fix)
Related issues:
- Change what is contained in the result of a resolved $resource promise #14460
- ngRepeat: property names starting with "$" will not be rendered #6266
[1] Lodash only includes own, enumerable properties for omit
.