2013-08-08 5 views
19

Ich habe eine Winkel Ressource, die jetzt in der Ansicht vollständige Namen ich mag so etwas wie diesen

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

geht, kann ich eine Methode hinzufügen, so dass, wenn ich dies tun

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

anstelle der in html folgenden tun

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

ich tun, um dieses

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

Gibt es eine Möglichkeit, diese Eigenschaft der $resource hinzuzufügen?

+0

:) .. das vor etwa zwei Jahren war .. :) – debuggerpk

Antwort

51

Sie können es als eine Eigenschaft hinzufügen transformResponse verwenden, aber vielleicht schlage ich vor, das Hinzufügen nur eine Methode zu jedem Objekt, das die kombinierten Vor- und Nachnamen zurückgibt:

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

Dann nutzen:

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

Alle Funktionen, die unter Verwendung eines Prototyps hinzugefügt wurden, werden zu jedem von Ihrem Service zurückgegebenen Objekt hinzugefügt. Es ist eine großartige Möglichkeit, Hilfsmethoden hinzuzufügen, wenn Sie komplizierte Einstellungen für Serviceeigenschaften benötigen.

+0

Funktioniert gut. Stellen Sie nur sicher, dass Sie Eigenschaften mit 'this.' qualifizieren, stolperte über diese ... –

+1

Vielen Dank für die Beantwortung der eigentlichen Frage, anstatt" bessere "Alternativen für das spezifische Szenario des ursprünglichen Fragestellers bereitzustellen. – RonLugge

+0

@RonLugge aye aye Kapitän. Wie Tim schon sagte, pass auf, dass du dich darum kümmerst. – debuggerpk

1

Ich denke, Sie sollten sich transformResponse Weg betrachten.

BTW, welche Version von eckigen verwenden Sie?

+0

i Winkel 1.1.5 bin mit ... nie zuvor bei transformResponse sah, ließ mich schau es dir an, danke für den Zeiger – debuggerpk

+0

kannst du http://stackoverflow.com/questions/17134401/angular-extening-resource-subobject-with-custom-methoden sehen – falinsky

+0

oh .. danke .. das löst mein Problem i denke: D – debuggerpk

5

nach dem Spielen für eine Weile mit eckigen, ich denke, ein Kunden-Filter wäre eine viel klügere Ansatz, anstatt eine Eigenschaft auf $ Ressource hinzuzufügen.

hier ist, wie ein Filter zu tun

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