我有一个存储档案的范围变量:
viewScope.MY_SCOPE = new Array();
viewScope.MY_SCOPE.push(["id0", 0, true]);
viewScope.MY_SCOPE.push(["id1", 1, false]);
viewScope.MY_SCOPE.push(["id2", 3, true]);
现在我想更新其中一个项目。
viewScope.MY_SCOPE[1][2] = "true";
并且失败并显示错误:
put(int index,FBSValue value)
中不支持执行JavaScript操作表达式JavaWrapperObject
时出错。
如何更新阵列中的特定项目?
答案 0 :(得分:2)
将SSJS数组对象添加到作用域时,会将其转换为java.util.Vector。因此,如果要设置值,则应使用
viewScope.MY_SCOPE[1].set(2,"true");
而不是viewScope.MY_SCOPE[1][2] = "true";
。
我认为问题在于使用...[2] = "true"
尝试执行给定对象的put
方法。虽然地图中提供了put
,例如HashMaps或范围地图,但使用set
代替put
来更改值。因此,您将获得“不支持操作表达式(...)”错误。与此相反,使用viewScope.MY_SCOPE[1][2]
获取变量没有问题,因为get
方法在HashMaps和Vectors中均可用。
答案 1 :(得分:1)
在范围变量中存储数组时,我喜欢将值放入正确类型的javascript变量中,进行编辑,然后用更新后的值替换范围变量。
在你的情况下,我会做以下事情:
var tempVar = viewScope.MY_SCOPE.toArray(); //convert to array to make sure properly typed
tempVar[1][2] = true;
viewScope.put(MY_SCOPE,tempVar);
<强>更新强> 在测试了我的代码之后,我也得到了同样的错误。说实话,我从来没有想过多维阵列。这是使用一系列对象的绝佳机会:
var tempVar = []; // initialize the array
tempVar.push({val1:"id0",val2:0,val3:true});
tempVar.push({val1:"id1",val2:1,val3:false});
tempVar.push({val1:"id2",val2:3,val3:true});
viewScope.put("MY_SCOPE",tempVar);
然后更改所需的值:
var tempVar = [];
tempVar = viewScope.get("MY_SCOPE");
tempVar[1].val3 = true;
viewScope.put("MY_SCOPE",tempVar)
我测试了这种方法,但效果很好。