Załóżmy, że mam Foo.class w Javie:Czy istnieje sposób, aby "oczekiwać" wystąpienia określonej klasy Java w kodzie JavaScript?
public class Foo {
public int id;
public String data;
}
A że mam Foo "klasa" w JavaScript:
function Foo(id, data) {
this.id = id;
this.data = data;
}
Również załóżmy, że mam kontrolera Java, która zwraca instancję Foo .class jako odpowiedź na żądanie REST. W moim kodzie JavaScript (AngularJS) żądanie jest wysyłane jako:
$http.get(url + 'bar/get-foo/')
.success(function (response) {
var foo = new Foo(response.id, response.data);
logger.info("SUCCESS: /get-foo");
})
.error(function (error_message) {
logger.error(error_message)
});
I działa. Ale czy istnieje sposób na uniknięcie przekazywania każdej właściwości z odpowiedzi na konstruktor Foo (jakiegoś rodzaju oczekiwanie na obiekt Foo lub rzucenie go na obiekt Foo)?
Próbowałem za pomocą Object.create(Foo, response)
ale mam TypeError: Property description must be an object: true
Oczywiście zawsze istnieje możliwość refactoring boczną Foo konstruktora JavaScript do:
function Foo(foo) {
this.id = foo.id;
this.data = foo.data;
}
Ale to wymagałoby Refactor dużych części kodzie .
Dzięki za poświęcony czas. Doceniam to!
PS: Dla tych, którzy zastanawiają się, dlaczego tego potrzebuję: nie ma problemu z małymi klasami, takimi jak Foo, ale niektóre odpowiedzi są przypadkami znacznie większych klas (z kilkunastoma polami), które nie są pod moim kontrola.
EDYCJA: Zaakceptowałem odpowiedź Chichozella tylko dlatego, że wymaga najmniejszej ilości pracy. Odpowiedzi Robina i jonnyknowsbest również działają (i będą działać dla czystego JavaScriptu, w przeciwieństwie do odpowiedzi Chichozella, która jest specyficzna dla AngularJS). Nie próbowałem odpowiedzi Laurentiu L., ale wygląda na to, że powinno również zadziałać. W każdym razie jest to rozwiązanie (nie rozwiązanie):
.success(function (response) {
var foo = new Foo();
angular.extend(foo, response); // angular.merge() for "deep-copy"
//...
}
Wielkie dzięki dla wszystkich, którzy odpowiedzieli/komentowane/edytowane w tym wątku.
Dzięki, nigdy nie wiedziałem o tych funkcjonalnościach AngularJS. – zkristic