zkr*_*tic 8 javascript java casting angularjs
假设我在Java中有Foo.class:
public class Foo {
public int id;
public String data;
}
Run Code Online (Sandbox Code Playgroud)
而且我在JavaScript中有Foo"class":
function Foo(id, data) {
this.id = id;
this.data = data;
}
Run Code Online (Sandbox Code Playgroud)
另外,假设我有Java控制器,它返回Foo.class的实例作为对REST请求的响应.在我的JavaScript(AngularJS)代码中,请求发送为:
$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)
});
Run Code Online (Sandbox Code Playgroud)
它有效.但有没有办法避免将每个属性从响应传递到Foo构造函数(某种期望Foo对象,或将其转换为Foo对象)?
我试过用Object.create(Foo, response)
但是得到了TypeError: Property description must be an object: true
当然,总是有可能将JavaScript端Foo构造函数重构为:
function Foo(foo) {
this.id = foo.id;
this.data = foo.data;
}
Run Code Online (Sandbox Code Playgroud)
但是,这需要重构大部分代码库.
谢谢你的时间.我很感激!
PS:对于那些想知道为什么我需要这个的人:对于像Foo这样的小类来说这不是问题,但是一些响应是更大类(具有十几个字段)的实例,这些不在我的控制之下.
编辑:我接受Chichozell的答案只是因为它需要的工作量最少.Robin和jonnyknowsbest的答案也有效,(并且适用于纯JavaScript,不像Chichozell的答案,这是AngularJS特有的).没有试过Laurentiu L.的答案,但看起来它也应该有效.无论如何这是一个解决方案(不是解决方案):
.success(function (response) {
var foo = new Foo();
angular.extend(foo, response); // angular.merge() for "deep-copy"
//...
}
Run Code Online (Sandbox Code Playgroud)
非常感谢在此主题中回答/评论/编辑过的所有人.
小智 1
如果你想让你的 Java 思维停留在 javascript 上,请尝试使用 angular.extend(),它会将一个对象的属性“复制”到另一个对象
this = angular.extend(this, response)
Run Code Online (Sandbox Code Playgroud)
在 foo 函数中,或直接在控制器上:
Foo = angular.extend(Foo, response)
Run Code Online (Sandbox Code Playgroud)