我有一个具有保护条款的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;
}
答案 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))