2014-12-27 103 views
1

我有一个数组引用($部分)在藏匿处。我试图取消这个并将其分配给一个JavaScript数组,但没有任何我尝试的作品。mojolicious分配一个数组到一个javascript变量

例如

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

导致列表等于ARRAY0x23456(这是正确的,因为$部分是一个REF)

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

给数组长度列出(因为列表被处理,其是正确的作为标量分配)。

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

给出了一个错误,因为$部分是裁判

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

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

我该怎么做?

编辑; 我已经设法做到这一点,形成一个字符串与其中的数组值,然后创建我想从这个数组。

例如藏匿包含$字符串 字符串5,6,7,8的JavaScript中,我可以再做

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

我还是很想知道,如果有一种方法可以做到这一点使用中的数组引用藏。

回答

0

片段:

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

谢谢,我不知道S“ - 这也是有用的。所以大括号只是将作业范围限制为$”? – mark 2014-12-28 21:25:06

+0

@mark,'local'限制对周围范围的赋值,并在该范围退出时恢复旧值,并且周围范围由大括号分隔。当您更改perl的预定义全局变量时,使用'local'被认为是很好的做法。 – 7stud 2014-12-28 21:32:28

相关问题