【问题标题】:how to update a value in array scoped variable?如何更新数组范围变量中的值?
【发布时间】:2014-08-15 16:58:19
【问题描述】:

我有一个存储档案的作用域变量:

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";

这会失败并出现错误:

执行 JavaScript 动作表达式时出错 put(int index,FBSValue value)JavaWrapperObject 中不受支持。

如何更新数组中的特定项?

【问题讨论】:

  • 在上述代码中,viewScope.MY_SCOPE[1][2] 返回false。您的错误表明您以某种方式滥用您的库。你能告诉我们更多相关的代码吗?
  • @forgivenson 你是对的,我编辑了
  • 就是这样.. 没什么更具体的了.. 我只需要更新一个数组项.. 有没有特定的方法使用 .PUT 数组来更新项?
  • 在纯 javascript 中,该分配很好。但是由于您的错误与this thread 中的错误相似,我认为它与 XPages 以及您使用它的方式有关。
  • 问题可能是数组存储在viewScope中,这是一个Java HashMap。因此,存在与您如何通过哈希映射到达数组有关的问题。迈克尔的回答通过首先获取数组并将其放入变量来解决这个问题。然后按预期使用本地对象/数组,然后将其放回存储范围。

标签: javascript xpages


【解决方案1】:

将 SSJS 数组对象添加到作用域时,它被转换为 java.util.Vector。因此,如果你想设置值,你应该使用

viewScope.MY_SCOPE[1].set(2,"true");

而不是viewScope.MY_SCOPE[1][2] = "true";

我认为问题在于使用...[2] = "true" 会尝试执行给定对象的put 方法。虽然 put 在 Maps(如 HashMaps 或范围映射)中可用,但 Vectors 使用 set 而不是 put 来更改值。因此,您会收到“不支持操作表达式 put(...)”错误。与此相反,使用viewScope.MY_SCOPE[1][2] 获取变量是没有问题的,因为get 方法在HashMaps 和Vectors 中都可用。

【讨论】:

    【解决方案2】:

    在范围变量中存储数组时,我喜欢将值放入正确类型的 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)
    

    我测试了这个方法,效果很好。

    【讨论】:

    • 同样的错误:JavaWrapperObject 不支持 put(int index,FBSValue value)
    • 哎呀... viewScope.put("MY_SCOPE",tempVar);
    • Michael - 我编辑了您的代码以添加引号。我认为应该可以正常工作。
    • 我不是 JavaScript 数组方面的专家。你确定这可以在纯javascript中工作吗?更新?也许 tempVar["1"][2]?只是猜测。我不介意在纯 javascript 中看到这个数组的 jsFiddle。也许你最好把一个对象放在数组w3schools.com/js/js_arrays.asp
    • 我已经修改了我的答案以使用对象数组而不是多维数组。
    猜你喜欢
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多