①分析为什么要用JSON.parse()。
一、找到调用$scope.findOne()方法的按钮。
二、在前端的控制层(controller层)找到$scope.findOne( )方法。
三、在前端的服务层(service层)找到typeTemplateService.findOne($scope.entity03)对应的内容。
四、通过前端服务层(service层)得到typeTemplateService.findOne($scope.entity03)对应的内容:$http.post(.........)
与后端交互。找到后端控制层(controller层)。通过:"../typeTemplate/findOne.do"即找到 @RequestMapping("findOne")和@RequestMapping("/typeTemplate"),即在类文件TypeTemplateController.java中找。
返回类型是类TbTypeTemplate.java
因为数据库里面的类型是varchar类型,所以对应String类型。
typeTemplateController.js文件中的一段内容:
$scope.findOne = function($event){
$scope.entity03= {id: $event.target.parentNode.parentNode.children[1].innerText};
typeTemplateService.findOne($scope.entity03).success(
function(response){
$scope.entity = response;
}
);
}
$scope.entity = response;
其中response里面对应的id是Long类型,name、specIds、brandIds和customAttributeItems都是String类型。而不是集合(数组)类型。
所以$scope.entity.id是Long类型。$scope.entity.name 、$scope.entity.specIds、$scope.entity.brandIds和$scope.entity.customAttributeItems都是String类型,而不是集合(数组)类型。
但是我们在定义的时候,将entity定义成:{id:数字,name:字符串,specIds:[ 集合(数组) ],brandIds:[ 集合(数组)],customAttributeItems:[ 集合(数组) ]}
angularjs中的变量entity,name是定义成字符串,但是数据库中带[ ]的varchar类型在angularjs的变量中定义成集合(数组)。在存储(新建保存和修改保存)到后端和数据库的时候,自动将angularjs的变量转换成对应类,此处是类TbTypeTemplate.java。即保存数据到数据库时,自动将前端的集合(数组)类型,如格式是[ ],的数据转换成类TbTypeTemplate.java中对应数据类型,如String类型。
上面的$scope.entity里面的内容是:{id:数字,name:字符串,specIds:[ 集合(数组)],brandIds:[ 集合(数组)],customAttributeItems:[ 集合(数组)]},在保存的时候,如下:
entity06和entity07就是$scope.entity
从上面的后端代码,可以看出,前端传给后端的时候,即entity06和entity07都是TbTypeTemplate.java类的类型。前端自动将传入的参数$scope.entity中的id转换成对应的Long类型,name转换成对应的String类型,specIds、brandIds和customAttributeItems的angularjs的集合(数组)类型转换成对应的TbTypeTemplate.java类的String类型,然后以对应的类型存到数据库中。数据库中:类中Long类型的id为bigint类型,类中String类型的name、specIds、brandIds和customAttributeItems在数据库为varchar类型(但是specIds、brandIds和customAttributeItems在前端的angularjs中定义成了集合(数组)类型)。
存储的时候,集合(数组)类型自动转换成String类型。
注意:ng-model和select2-model绑定的变量值,要显示后端数据库的值,数据库中带[ ]数据的字符串(String)类型即varchar类型必须要转换成集合(数组)形式!!!
如下:entity.id不用绑定,主键自增长形式。不用绑定。其余要绑定。
要想ng-model和select2-model绑定的值显示,则entity中带[ ]的数据内容要是集合(数组)类型,不能是字符串(String)类型。但是:
再前面已经对返回类型为TbTypeTemplate.java进行分析,response即$scope.entity中name、specIds、brandIds和customAttributeItems都是String类型。ng-model和select2-model,对带有[ ]的String类型不能显示。需要转换成集合(数组)形式,angularjs绑定变量时,ng-model和select2-model需要将带有[ ]的String类型的数据转换成集合(数组)形式,才能显示。
findOne方法,response返回TbTypeTemplate.java类型,所以:
$scope.entity={id:数字,name:“字符串”,specIds:“带[ ]的字符串”,brandIds:“带[ ]的字符串”,customAttributeItems:“带[ ]的字符串”};
要让angularjs绑定变量时,ng-model和select2-model需要将带有[ ]的String类型的数据转换成集合(数组)形式,才能显示。
如何转换String类型到对应的angularjs变量为集合(数组)类型:用JSON.parse(“带[ ]的字符串”);否则点击修改按钮后只显示name不显示关联品牌、关联规格和扩展属性。