angular / angular.js

AngularJS - HTML enhanced for web apps!
https://angularjs.org
MIT License
58.81k stars 27.5k forks source link

$resource: enumerability of methods and properties, `toJSON` #14637

Open jrvidal opened 8 years ago

jrvidal commented 8 years ago

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:

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:


[1] Lodash only includes own, enumerable properties for omit.

gkalpak commented 8 years ago

:+1: for documenting Resource.prototype.toJSON. PRs welcome :wink:

I would also consider making Angular-stuff non-enumerable in 1.6/1.7 (since it's a breaking change), as long as all supported browsers behave consistently. If anyone wants to take a crack at it, please do !