2015-05-26 11 views
16

Możliwe jest zdefiniowanie Angular $resource, który ma zawsze takie same wartości domyślne przy tworzeniu z new()?

Na przykład jeśli mam następującą definicję zasobu:

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

a obiekt szuflada musi mieć „skarpety” właściwość, że chcę być zawsze inicjowany jako pustą tablicę [], a może inni jak "timesOpened" na 0, lub podobne rzeczy.

Jedynym sposobem na to byłoby jak:

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

Myślałam o zdefiniowanie w tej samej usługi mam dla mojego zasobu (nazwijmy go drawerService) domyślnej/inicjalizacji obiektu takiego:

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

A potem przy tworzeniu zasobu:

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

Czy to jedyny sposób na zrobienie tego?

Odpowiedz

14

Masz rację, nie ma prostego sposobu, aby to zrobić; nie jest obsługiwaną funkcjonalnością w Angular. Czystszym sposobem, w jaki możesz to zrobić, jest utworzenie fabryki szuflad w twojej szufladzie. Może to wyglądać mniej więcej tak:

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

Pozwoliłoby to na stworzenie nowej Szuflada tak:

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

To wciąż nie jest idealny, ale jest nieco czystsze i najmniej zły sposób mogę myśl o osiągnięciu tego, co próbujesz osiągnąć.

+0

Hey @ kanzelm3, przepraszam za nie przyjście tutaj wcześniej. Tak więc twoją odpowiedzią jest ulepszona i czystsza wersja tego, co napisałem :) Podoba mi się, ale zamierzam zostawić to trochę dłużej, na wypadek, gdyby wpadł jakikolwiek inny pomysł. Jeśli nie, zaznaczę twoją odpowiedź jako jeden poprawny! Dziękuję Ci bardzo! –

0

Wpadłem ostatnio na ten problem i był to pierwszy wpis, który pojawił się w Google ... Odpowiedź dostarczona działa, ale jest dość niechlujna i zmienia sposób, w jaki musisz interakcować z twoim obiektem $ resource . Jest znacznie prostszy sposób :)

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

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

    return drawer; 
} 

A potem po prostu utworzyć nowy obiekt z domyślnych następująco:

var drawer = new drawerService(); 

I można również przekazać własnymi params tutaj zbyt .. .

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

nadzieję, że może komuś pomóc w przyszłości: D

+0

To nie działa zgodnie z przeznaczeniem. Prototypowi członkowie będą "statyczni", tj. Udostępniani we wszystkich instancjach. Powinien być używany tylko do funkcji. –