2015-05-26 21 views
16

È possibile definire un numero angolare $resource che ha sempre gli stessi valori predefiniti alla creazione con new()?

Per esempio, se ho la seguente definizione di risorsa:

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

E l'oggetto cassetto ha bisogno di avere una proprietà "calzini" che voglio essere sempre inizializzato come un array vuoto [], e forse alcuni altri come 'timesOpened' a 0, o cose del genere.

L'unico modo per farlo sarebbe come:

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

stavo pensando a definire nello stesso servizio che ho per la mia risorsa (chiamiamolo drawerService) un oggetto predefinito/inizializzazione in questo modo:

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

E poi quando si crea la risorsa:

//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'}); 

È questo l'unico modo per farlo?

risposta

14

Si è corretto, non esiste un modo semplice per farlo; non è una funzionalità supportata in Angular. Un modo più semplice per farlo è creare una fabbrica di cassetti nel tuo cassettoServizio. Potrebbe sembrare qualcosa di simile:

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 
    }; 
}); 

Ciò consentirebbe di creare un nuovo cassetto in questo modo:

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

Non è ancora l'ideale, ma è un po 'più pulito e il modo meno male che posso pensa di realizzare ciò che stai cercando di realizzare.

+0

Hey @ kanzelm3, mi dispiace per non venire qui in precedenza. Quindi la tua risposta è una versione migliorata e più pulita di ciò che ho postato :) Mi piace, ma lascerò questo tempo un po 'di più nel caso in cui altre idee vi entrino. Se no, segnerò la tua risposta come correggi uno! Grazie mille! –

0

Mi sono imbattuto recentemente in questo problema, e questo è stato il primo post pubblicato su Google ... La risposta fornita funziona, tuttavia è piuttosto disordinato e cambia il modo in cui devi interagire con il tuo oggetto $ resource . C'è un modo molto più semplice :)

angular.module('app').factory('drawerService', function() { 
    var drawer = $resource('/drawer/:drawerId', { drawerId: '@id'}); 

    drawer.prototype.socks = []; 
    drawer.prototype.timesOpened = 0; 

    return drawer; 
} 

E poi si sarebbe sufficiente creare un nuovo oggetto con le impostazioni predefinite come segue:

var drawer = new drawerService(); 

E si può anche passare le proprie params anche qui .. .

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

Spero che questo possa aiutare qualcuno in futuro: D

+0

Questo non funziona come previsto. I membri del prototipo saranno "statici", cioè condivisi tra tutte le istanze. Dovrebbe essere utilizzato solo per le funzioni. –

Problemi correlati