mojolicious 将数组分配给 JavaScript 变量

mojolicious assign an array to a javascript variable

本文关键字:JavaScript 变量 分配 数组 mojolicious      更新时间:2023-09-26

我在仓库里有一个数组引用($sections)。 我正在尝试取消引用并将其分配给 javascript 数组,但我尝试的任何内容都不起作用。

例如

%= javascript begin
    var list = <%== $sections %>;
    etc...
% end

导致列表等于 ARRAY0x23456(这是正确的,因为$sections是一个引用)

%= javascript begin
    var list = <%== @$sections %>;
    etc...
% end

将数组长度分配给列表(这是正确的,因为列表被视为标量赋值)。

%= javascript begin
    var list = <%== $sections %>.slice();
    etc...
% end

给出错误,因为$sections是一个引用

%= javascript begin
    var list = <%== @$sections %>.slice();
    etc...
% end

可以说是最有可能的候选者,但解析为 [array.length].slice()(例如 3.slice()),并且失败了。

我该怎么做?

编辑;我设法通过在存储中形成一个包含数组值的字符串,然后从中创建我想要的数组来做到这一点。

例如,Stash包含字符串5,6,7,8$string在JavaScript中,我可以做

array = [ <%= $string %> ];

我仍然有兴趣知道是否有办法使用藏匿处的 arrayref 来做到这一点。

片段:

<%== @$sections %>

相当于:

print scalar @$sections;

。所以这就是你得到数组长度的原因:标量上下文中的数组是数组的长度。

要获取一个javascript数组,你必须将下面的<...>替换为会导致输出看起来像js数组的东西:

print scalar <....>;

你可以做这样的事情:

use Mojolicious::Lite;
get '/test' => sub {
    my $c = shift;
    $c->stash(sections => [1, 2, 3]);
    {
        local $" = ", ";  #The value that gets inserted between array elements 
                          #when an array is interpolated into a string. The default
                          #value is a space.
        $c->render('template1');
    } 
    # $" gets reset to its previous value here
};
app->start;
__DATA__
@@ template1.html.ep
%= javascript begin
  var arr =  <%== "[@$sections]" %>;
  console.log(arr[0]);
% end
Examine your browser's javascript console....