2015-05-13 4 views
0

Я пытаюсь использовать подмешать охранник when состояния, но во время компиляции я получаю следующее сообщение об ошибке:Вызов Mixin если переменный определена

.mixin is undefined

.mixin (@color) when (isstring(@color)) { 
    //some code 
} 

.mixin(#008000); 

Когда я удалить условие when он работает. В чем проблема?


Проблема в том, что у нас есть переменные внутри наших меньших файлов, которые определены в одном компиляционном процессе. Но во время другого компиляционного процесса эти переменные не определены, потому что здесь нам нужно немного динамически.

Поэтому я должен проверить, определена ли переменная. Когда я пытаюсь его на

$variables = [ 
    'testColor' => '#fff111', 
]; 
$lessc->setVariables($variables); 
$cachedCompile = $lessc->cachedCompile($publicPath . $inputFile); 

и

.mixin (@color:none) when (iscolor(@color)) { 
    color: #fff; 
} 

.mixin(@testColor); 

Все работает. Но когда я удаляю переменную testColor в переменном-массиве, она выходит из строя, потому что она не определена.

+0

Нет ничего плохого в том, как вы определили mixin, и вы наверняка не получите эту ошибку. Вы можете проверить на lesstester.com. Кроме того, использование 'isstring()' в цвете означает, что mixin ничего не выводит, потому что условие терпит неудачу. – Harry

+0

Вы также получаете ошибку с 'when (@color = '')'? – Manwal

+1

Да, основная проблема, которую я пытаюсь исправить из-за защиты mixin, - проверить, определена ли переменная или нет. Есть ли другой способ сделать это меньше? – user3314010

ответ

1

Ваша проблема может быть связана с тем, что вы пытаетесь передать переменную (@testColor), которая не существует в качестве параметра для mixin. Попробуйте добавить нижнюю строку к самой верхней части вашего файла Less.

@testColor: none; 

С Less делает отложенную загрузку переменных, если есть значение, установленное во время компиляции, которые должны перезаписать none. Если во время компиляции не задана переменная, указанная выше строка все равно будет означать, что переменная определена и имеет значение по умолчанию.


Там нет прямого isnull или isnotnull типа функции в Less. Однако вы можете имитировать поведение, присвоив значение по умолчанию для mixin.

В приведенном ниже примере мы назначаем значение по умолчанию как none, которое не является цветом, и, следовательно, при условии, что условие iscolor(@color) проверено, оно потерпит неудачу, и mixin не выдаст никакого результата.

Я также добавил условие not ниже, чтобы вы могли увидеть разницу.

.mixin (@color:none) when (iscolor(@color)) { 
    //some code 
    color: is defined; 
} 
.mixin (@color:none) when not (iscolor(@color)) { 
    //some code 
    color: is not defined; 
} 

#output1{ 
    .mixin(); 
} 
#output2{ 
    .mixin(#ff0000); 
} 
#output3{ 
    .mixin(abcd); 
} 
Смежные вопросы