2015-04-28 24 views
8

假设我有让Foo.class在Java中:有没有办法在JavaScript代码中“期待”某个Java类的实例?

public class Foo { 
    public int id; 
    public String data; 
} 

,我还拥有富 “阶级” 在JavaScript:

function Foo(id, data) { 
    this.id = id; 
    this.data = data; 
} 

另外,假设我有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) 
    }); 

它的工作原理。但有没有办法避免每个属性响应Foo构造函数(某种期待Foo对象,或将其转换为Foo对象)?

我尝试使用Object.create(Foo, response)但我得到TypeError: Property description must be an object: true

当然总是有重构JavaScript端美孚构造成的可能性:

function Foo(foo) { 
    this.id = foo.id; 
    this.data = foo.data; 
} 

但是,这将需要的代码库的很大一部分的重构。

谢谢你的时间。我很感激!

PS:对于那些想知道为什么我需要这个:这对于像Foo这样的小班来说不是问题,但是一些回答是一个更大的班级(超过十几个字段)的实例,这些都不在我的控制。

编辑:我接受Chichozell的答案只是因为它需要的工作量最少。 Robin's和jonnyknowsbest的答案也适用,(并且将用于纯JavaScript,不同于Chichozell的答案,这是AngularJS特有的答案)。没有尝试Laurentiu L.的答案,但看起来应该也可以。 反正这是一个解决方案(而不是解决方案):

.success(function (response) { 
    var foo = new Foo(); 
    angular.extend(foo, response); // angular.merge() for "deep-copy" 
    //... 
} 

非常感谢大家谁回答/评论/在这个线程编辑。

回答

1

如果你想保持你的Java思考的JavaScript,请尝试使用angular.extend(),这将“复制”一个对象的属性到另一个

this = angular.extend(this, response) 

在foo的功能,或者直接在控制器:

Foo = angular.extend(Foo, response) 
+0

谢谢,我从来不知道这些AngularJS的功能。 – zkristic

1

你可以做这样的事情“deserialise”的JSON收到作为响应返回到初始化对象:

function JSONToObj(jsondata) { 
    var json = JSON.parse(jsondata); 

    var name = null; 
    for(var i in json) { //Use first property as name 
     name = i; 
     break; 
    } 

    if (name == null) 
     return null; 

    var obj = new window[name](); 
    for(var i in json[name]) 
     obj[i] = json[name][i]; 

    return obj; 
} 

这是假设,构造在全球范围和响应是JSON存在格式如下:

{ 
    "Foo": { 
     "id": "the id", 
     "data": "the data" 
    } 
} 
+0

您正在执行第一个属性作为全局构造函数...? –

+0

哦,我想我明白了!也许要澄清你的答案,提供一个JSON格式响应应该是什么样子的例子。 –

+0

非常感谢编辑Patrick:o) –

1

你也可以做一些类似this jsFiddle的实现你描述的结构。 createObject函数couold看起来像下面的代码片段。

function createObject(response, toCreate){ 
    var newObject = new toCreate(); 
    for(var attr in response){ 
     if(newObject.hasOwnProperty(attr)){ 
      newObject[attr] = response[attr]; 
     } 
    } 
    return newObject; 
} 

如果你创建对象,这需要JS对象具有相同属性作为函数的响应参数和函数作为toCreate参数(你要创建的对象)。

查看jsFiddle控制台日志输出,你会发现它的工作原理。

你也可以像在jsFiddle中看到的那样,移除hasOwnProperty的检查来设置响应中的所有属性,而不管javascript函数是否定义了它们。

1

如果您愿意,可以使其非常通用。而且不会有太多的重构工作要做​​,而且这个解决方案将会减轻你对这两个类的未来变化。

您可以将您的Foo javascript对象更改为Angular JS服务,并在需要时将其注入。这样你就可以在全球范围内获得你的数据。这比局部变量foo好。

yourApp.factory('Foo', 
     function() { 
      //set a default or just initialize it 
      var fooObject= {}; 
      return { 
       getId: function() { return fooObject.id; }, 
       getData: function() { return fooObject.data;}, 
       setId: function(newId){fooObject.id = newId}, 
       setData: function(newData){fooObject.data=newData;}, 

       initializeFromObject : function(response){ 
        for (var prop in response){ 
          fooObject[prop] = response[prop]; 
        } 
       } 
      }; 
     } 
    ); 

您也可以创造新的服务更安全与像hasAllProperties方法(通过该对象的属性进行迭代,无论它是一个数组或对象)。 ; hasNullValues等。

希望这有助于你看到它的价值。

相关问题