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