2013-08-08 4 views
19

Ho una risorsa angolare che va qualcosa come questo

app.factory('User', function ($resource) { 
    return $resource(
     '/api/user/:listCtrl:id/:docCtrl/', { 
      id: '@id', 
      listCtrl: '@listCtrl', 
      docCtrl: '@docCtrl' 
     }, { 
      update: { 
       method: 'PUT' 
      }, 
      current: { 
       method: 'GET', 
       params: { 
        listCtrl: 'current' 
       } 
      }, 
      nearby: { 
       method: 'GET', 
       params: { 
        docCtrl: 'nearby' 
       }, 
       isArray: true 
      } 
     } 
    ); 
}); 

ora voglio avere il nome completo nella vista, posso aggiungere un metodo in modo che quando faccio questo

$scope.user = User().current(); 

invece di fare quanto segue in html

<p>{{ user.first_name }} {{ user.last_name }}</p> 

faccio questo

<p>{{ user.get_full_name }}</p> 

c'è un modo per aggiungere questa proprietà allo $resource?

+0

:) .. questo è stato circa due anni fa .. :) – debuggerpk

risposta

51

È possibile aggiungere come una proprietà utilizzando transformResponse, ma potrei suggerire solo l'aggiunta di un metodo per ogni oggetto che restituisce il nome e il cognome combinato:

app.factory('User', function ($resource) { 
    var User = $resource(
     '/api/user/:listCtrl:id/:docCtrl/', { 
      id: '@id', 
      listCtrl: '@listCtrl', 
      docCtrl: '@docCtrl' 
     }, { 
      update: { 
       method: 'PUT' 
      }, 
      current: { 
       method: 'GET', 
       params: { 
        listCtrl: 'current' 
       } 
      }, 
      nearby: { 
       method: 'GET', 
       params: { 
        docCtrl: 'nearby' 
       }, 
       isArray: true 
      } 
     } 
    ); 
    // add any methods here using prototype 
    User.prototype.get_full_name = function() { 
     return this.first_name + ' ' + this.last_name; 
    }; 
    return User; 
}); 

Quindi utilizzare:

<p>{{ user.get_full_name() }}</p> 

Tutte le funzioni aggiunte utilizzando il prototipo verranno aggiunte a tutti gli oggetti restituiti dal servizio. È un ottimo modo per aggiungere metodi di supporto se hai bisogno di fare complicati ottenere o impostare le proprietà del servizio.

+0

Funziona bene. Basta fare in modo che si qualificano proprietà con 'this.', inciampò su questo ... –

+1

Grazie per rispondere alla domanda effettiva, invece di fornire alternative 'migliori' per lo scenario specifico del richiedente originale. – RonLugge

+0

@RonLugge aye aye capitano. come ha detto Tim, assicurati di prenderti cura di questo. – debuggerpk

1

penso che si dovrebbe guardare modo transformResponse.

Btw, quale versione di angolare si usa?

+0

sto usando angolare 1.1.5 ... mai guardato transformResponse prima, mi permetta check-out, grazie per il puntatore – debuggerpk

+0

si possono guardare http://stackoverflow.com/questions/17134401/angular-extending-resource-subobject-with-custom-methods – falinsky

+0

oh .. grazie .. questo risolve il problema che ho pensa: D – debuggerpk

5

dopo aver giocato per un po 'con angolare, penso che un filtro cliente sarebbe un approccio molto più saggio, piuttosto che aggiungere una proprietà su $ risorsa.

qui è come fare un filtro

app.filter('getFullName', function() { 
    return function (input) { 
     if (input) { 
     return input.first_name + ' ' + input.last_name; 
     } else { 
     return 'default'; 
     } 
    }; 
    });