【问题标题】:mojolicious assign an array to a javascript variablemojolicious 将数组分配给 javascript 变量
【发布时间】:2014-12-27 20:49:24
【问题描述】:

我在存储中有一个数组引用($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 在 $string 中包含字符串 5,6,7,8 然后我可以在javascript中做

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

我仍然很想知道是否有办法使用存储中的 arrayref 来做到这一点。

【问题讨论】:

    标签: javascript arrays perl mojolicious


    【解决方案1】:

    片段:

    <%== @$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....
    

    【讨论】:

    • 谢谢,我不知道 S" - 这也很有用。所以大括号只是将赋值范围限制为 $"?
    • @mark, local 将赋值限制在周围范围内,并在退出该范围时恢复旧值,并且周围范围由大括号分隔。当您更改 perl 的预定义全局变量时,使用 local 被认为是一种很好的做法。
    猜你喜欢
    • 1970-01-01
    • 2016-12-12
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2020-11-01
    • 2018-01-11
    • 1970-01-01
    相关资源
    最近更新 更多