2011-04-05 53 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