track tag attribute javascript angularjs ngresource

javascript - tag - ¿Creando nuevo recurso $ angular con valores por defecto?



track element html5 (2)

¿Es posible definir un $resource Angular que siempre tenga los mismos valores predeterminados en la creación con new() ?

Por ejemplo, si tengo la siguiente definición de recurso:

var Drawer = $resource(''/drawer/:drawerId'', { drawerId: ''@id''});

Y el objeto Drawer debe tener una propiedad de "calcetines" que quiero que siempre se inicialice como una matriz vacía [] , y tal vez algunos otros como ''timesOpened'' to 0, o cosas así.

La única manera de hacer esto sería como:

var newDrawer = new Drawer({ socks: [], timesOpened: 0});

Estaba pensando en definir en el mismo servicio que tengo para mi recurso (llamémoslo drawerService ) un objeto predeterminado / inicialización como este:

defaultDrawer = { socks: [], timesOpened: 0};

Y luego al crear el recurso:

//New drawer with defaults var newDrawer = new drawerService.Drawer(drawerService.defaultDrawer); //New drawer with defaults and some other initialization var anotherDrawer = new drawerService.Drawer(angular.extend(drawerService.defaultDrawer, {material: ''plastic''});

¿Es esta la única manera de hacerlo?


Estás en lo correcto, no hay una manera fácil de hacer esto; No es una funcionalidad soportada en Angular. Una forma más limpia de hacer esto es creando una fábrica de cajones en su servicio de cajones. Podría verse algo como esto:

angular.module(''app'').factory(''drawerService'', function() { var Drawer = $resource(''/drawer/:drawerId'', { drawerId: ''@id''}); function drawerFactory(options) { var defaults = { socks: [], timesOpened: 0 }; options = angular.extend(defaults, options || {}); return new Drawer(options); } return { Drawer: Drawer, create: drawerFactory }; });

Esto te permitiría crear un nuevo Cajón así:

//New drawer with defaults var newDrawer = drawerService.create(); //New drawer with defaults and some other initialization var anotherDrawer = drawerService.create({material: ''plastic''});

Todavía no es lo ideal, pero es un poco más limpio y la forma menos malvada en la que puedo pensar en lograr lo que estás tratando de lograr.


Me encontré con este problema recientemente, y esta fue la primera publicación que apareció en Google ... La respuesta proporcionada funciona, sin embargo, es bastante complicada y cambia la forma en que tiene que interactuar con su objeto $ resource. Hay una manera mucho más sencilla :)

angular.module(''app'').factory(''drawerService'', function() { var drawer = $resource(''/drawer/:drawerId'', { drawerId: ''@id''}); drawer.prototype.socks = []; drawer.prototype.timesOpened = 0; return drawer; }

Y luego simplemente crearías un nuevo objeto con valores predeterminados de la siguiente manera:

var drawer = new drawerService();

Y también puedes pasar tus propios parámetros aquí también ...

var drawer = new drawerService({ material: ''plastic'' });

Espero que esto pueda ayudar a alguien en el futuro: D