Less Guard未按预期工作

时间:2016-08-30 11:26:38

标签: css less

我有一个具有保护条款的mixin。

我已按照指南操作,并认为下面的语法是正确的。

基本上,指南应确保@palette是一系列自定义颜色之一,并且@color是一组中的数字。

这很有效 - 它可以编译并生成正确的输出。

但是,如果我将@palette变量更改为导致错误,则Less不编译 - 这是预期的行为吗?

.AccentPalette(@palette; @color:500) when
    (@palette = amber), (@palette = blue), (@palette = blueGrey), (@palette = cyan), (@palette = deepOrange),
    (@palette = deepPurple), (@palette = green), (@palette = grey), (@palette = indigo), (@palette = lightBlue),
    (@palette = lightGreen), (@palette = lime), (@palette = orange), (@palette = pink), (@palette = purple),
    (@palette = red), (@palette = teal), (@palette = yellow) and
    (@color = 50), (@color = 100), (@color = 200), (@color = 300), (@color = 400),
    (@color = 500), (@color = 600), (@color = 700), (@color = 800), (@color = 900) {
    .Swatch(@palette); 

    @accentColor:"@{@{color}}";

    @accent50:  @50; 
    @accent100: @100; 
    @accent200: @200; 
    @accent300: @300; 
    @accent400: @400; 
    @accent500: @500; 
    @accent600: @600; 
    @accent700: @700; 
    @accent800: @800; 
    @accent900: @900;
}

这样称呼:

.AccentPalette(indigo);

一个样本示例 - 其中有一些,每种颜色一个。

.Swatch(amber)
{
    @50: #fff8e1;
    @100:#ffecb3;
    @200:#ffe082;
    @300:#ffd54f;
    @400:#ffca28;
    @500:#ffc107;
    @600:#ffb300;
    @700:#ffa000;
    @800:#ff8f00;
    @900:#ff6f00;
}

1 个答案:

答案 0 :(得分:0)

与我在之前的评论中所说的相反,问题实际上是@endorsements = Endorsement.joins(User).where(endorsing_user.company == current_user.company) 混合警卫。似乎Less编译器在.AccentPalette(或)之前评估and。因此,当您不为,变量提供任何值时,警卫总是会匹配,因为警卫@color始终为真。

考虑以下简化示例:

@color = 500

编译器似乎按如下方式对其进行评估:(注意额外的一对大括号)

@500: dummy; .AccentPalette(@palette; @color:500) when (@palette = amber), (@palette = blue) and (@color = 50), (@color = 500), (@color = 900) { .Swatch(@palette); accentColor:"@{@{color}}"; } .Swatch(amber){} .Swatch(blue){} #demo { .AccentPalette(amber;1000); }

此评估结果为(@palette = amber), ((@palette = blue) and (@color = 50)), (@color = 500), (@color = 900)(false, (false and false), true, false)),因此mixin始终匹配,因为只有一个(false, false, true, false

正确的解决方法是编写mixin后卫,如下所示:

true

但Less编译器似乎不喜欢额外的大括号并给出编译器错误。因此,唯一的选择似乎是将警卫分成两个级别,如下例所示。

((@palette = amber),(@palette = blue)) and ((@color = 50),(@color = 500),(@color = 900))