2011-04-05 51 views
3
%div{:class => [@item.type, @item == @sortcol && [:sort, @sortdir]] } Contents 

可能使任何的:请解释HAML代码/文档,这个片断

<div class="numeric sort ascending">Contents</div> 
<div class="numeric">Contents</div> 
<div class="sort descending">Contents</div> 
<div>Contents</div> 

我真的不明白这个片段的@sortcol && [:sort, @sortdir]一部分。

回答

3

这依赖于运算符优先级。所以它评估是这样的:

  1. @item == @sortcol是真或假。
    • false
      1. &&返回false因为其他部分不进行评价
      2. 因此代码减少到:class => [@item.type]
    • true
      1. &&返回表达式的第二部分。在这种情况下,阵列[:sort, @sortdir]
      2. HAML渲染因而前阵这相当于自动展平到:class => [@item.type, :sort, @sortdir]
+0

我会补充说,虽然技术上工作的代码,这是非常棘手的阅读。可能更好地将其移交给帮手,并给它一个更具描述性的名字,例如sort_order_class – 2011-04-05 13:08:40

+1

为了澄清,数组的扁平化可以用空格或下划线分隔。它是一个'class'类型的空格,并且当它是一个被扁平化的'id'类型时加下划线。 – Fendo 2011-04-05 13:35:24

1
[@item.type, @item == @sortcol && [:sort, @sortdir]] 
=> 
# if @item.type is blank, so class is still empty 
# if @item.type is "numeric" class is "numeric" 
class = @item.type 

# if @item equal @sortcol 
# class will append "sort" and @sortdir if it is not empty. 
if @item == @sortcol 
    class += "sort" 
    class += @sortdir 
end 

这种结构@item == @sortcol && [:sort, @sortdir]将返回[:排序,@sortdir]只有@item == @sortcol是真的

+0

好吧,我明白了。 '[:sort,@sortdir]'的输出在haml中被解释为一个'class',所以它会追加':sort'(作为文字),接着是一个空格,然后是'@ sortdir'(作为变量)。这就是我们如何以'按升序排序'或'按降序排序'的结果。感谢您帮助我理解这一点。 – Fendo 2011-04-05 13:01:13