繁体   English   中英

mojolicious将数组分配给javascript变量

[英]mojolicious assign an array to a javascript variable

我在存储中有一个数组引用($ sections)。 我正在尝试取消引用并将其分配给javascript数组,但是我尝试的任何方法都没有。

例如

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

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

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

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

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

给出错误,因为$ sections是参考

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

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

我怎样才能做到这一点?

编辑; 我已经成功地做到了,方法是在存储区中形成一个带有数组值的字符串,然后从中创建所需的数组。

例如,隐藏在javascript中的$ string中包含字符串5,6,7,8,然后可以执行

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....

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM