Gibt es eine Möglichkeit, eine bestimmte Java-Klasse in JavaScript-Code zu "erwarten"?

8

Angenommen, ich habe Foo.class in Java:

%Vor%

Und ich habe Foo "Klasse" in JavaScript:

%Vor%

Angenommen, ich habe einen Java-Controller, der die Instanz von Foo.class als Antwort auf eine REST-Anforderung zurückgibt. In meinem JavaScript-Code (AngularJS) wird die Anfrage wie folgt gesendet:

%Vor%

Und es funktioniert. Aber gibt es eine Möglichkeit zu vermeiden, jede Eigenschaft von der Antwort auf Foo-Konstruktor übergeben (eine Art erwartet das Foo-Objekt, oder wirft es in ein Foo-Objekt)?

Ich habe versucht mit Object.create(Foo, response) , aber ich bekomme TypeError: Property description must be an object: true

Natürlich gibt es immer eine Möglichkeit, den JavaScript-Seiten-Foo-Konstruktor in:

umzubauen %Vor%

Aber das würde Refactor eines großen Teils der Codebasis erfordern.

Danke für Ihre Zeit. Ich schätze es!

PS: Für diejenigen, die sich fragen, warum brauche ich das: Es ist kein Problem mit kleinen Klassen wie Foo, aber einige Antworten sind Instanzen einer viel größeren Klassen (mit mehr als einem Dutzend Felder), die nicht unter meiner Kontrolle sind .

BEARBEITEN: Ich habe Chichozells Antwort akzeptiert, weil sie am wenigsten Arbeit erfordert. Robins und jonnyknowsbests Antworten funktionieren auch (und werden für reines JavaScript funktionieren, anders als Chichozells Antwort, die AngularJS-spezifisch ist). Ich habe Laurentiu L.'s Antwort nicht versucht, aber es sieht so aus, als ob es auch funktionieren sollte. Wie auch immer, das ist eine Lösung (nicht die Lösung):

%Vor%

Vielen Dank an alle, die in diesem Thread geantwortet / kommentiert / editiert haben.

    
zkristic 28.04.2015, 07:53
quelle

4 Antworten

1

Wenn Sie Ihr Java-Denken in Javascript behalten möchten, versuchen Sie es mit angle.extend (), das die Eigenschaften eines Objekts in ein anderes

kopiert %Vor%

In der foo-Funktion oder direkt im controler:

%Vor%     
Cesar Delgado 28.04.2015, 08:12
quelle
1

Sie können so etwas tun, um den JSON, den Sie erhalten, als Antwort auf ein initialisiertes Objekt zu "deserialisieren":

%Vor%

Dies setzt voraus, dass der Konstruktor im globalen Gültigkeitsbereich existiert und dass die Antwort JSON-formatiert ist:

%Vor%     
Jonathan Smith 28.04.2015 08:01
quelle
1

Sie können es ziemlich generisch machen, wenn Sie wollen. Und es würde nicht zu viel Refactoring geben, und diese Lösung würde Ihre zukünftigen Änderungen in beiden Klassen erleichtern.

Sie können Ihr Foo-JavaScript-Objekt in einen Angular JS-Dienst ändern und es dort einfügen, wo Sie es benötigen. Auf diese Weise können Sie Ihre Daten global verfügbar machen. Es ist besser als diese lokale Variable foo.

%Vor%

Sie können die Erstellung neuer Dienste auch mit Methoden wie hasAllProperties sicherer machen (indem Sie die Eigenschaften des Objekts durchlaufen, egal ob es sich um ein Array oder ein Objekt handelt). ; hasNullValues ​​und so weiter.

Hoffe, das hilft und du siehst seinen Wert.

    
Laurentiu L. 28.04.2015 08:13
quelle
1

Sie können auch etwas wie dieses jsFiddle tun, um die von Ihnen beschriebene Struktur zu erreichen. Die createObject-Funktion sieht ähnlich aus wie das folgende Code-Snippet.

%Vor%

Sie haben createObject, das ein js-Objekt mit den gleichen Attributen wie Ihre Funktion als Antwortparameter und eine Funktion (das Objekt, das Sie erstellen möchten) als toCreate-Parameter verwendet.

Sehen Sie sich die jsFiddle-Konsolenprotokollausgabe an, und Sie sehen, dass es funktioniert.

Sie können auch, wie in jsFiddle zu sehen, die Prüfung für hasOwnProperty entfernen, um alle Attribute der Antwort unabhängig von der JavaScript-Funktion festzulegen.

    
Robin 28.04.2015 08:08
quelle

Tags und Links