2016-03-18 2 views
0

Я пытаюсь добавить имя класса элемента в срабатывают с помощью этого:CoffeeScript: Добавить условное название класса, управляемый булевой

className: "btn btn-primary #{[email protected]() ? 'disabled' : ''}" 

Однако это приводит к class="btn btn-primary true"

Этого код кофе скомпилированы в неправильную JS следующим образом:

className: "btn btn-primary " + ((ref = !this.valid()) != null ? ref : { 
      'disabled': '' 
     }), 

Каков правильный синтаксис этого в кофе?

+2

У CoffeeScript нет '? : 'ternary, он использует' if x, а затем y else z'. Я не знаю контекста достаточно хорошо, но у вас могут быть проблемы с тем, что '@' при построении этой строки тоже. –

+0

Да, это полностью работает. Можете ли вы разместить это как ответ :) – vipin8169

ответ

2

CoffeeScript не имеет С-стиль ?: тройных так что:

[email protected]() ? 'disabled' : '' 

распознаются как:

[email protected]() ? ({ 'disabled' : '' }) 

который является existential operator:

Экзистенциальный Оператор

Немного сложно проверить наличие переменной в JavaScript. if (variable) ... близок, но не выполняется нуль, пустая строка и ложь. экзистенциальный оператор CoffeeScript в ? возвращает истину, если переменная не является нулевой или неопределенными, что делает его аналогом nil?

Руби в сочетании с литерала объекта. Отсюда и странный JavaScript-код, который вы видите.

CoffeeScript использует if expressions вместо ?::

CoffeeScript может составить если таковые заявления в выражение JavaScript, используя тройной оператор, когда это возможно, и закрывающую упаковку в противном случае. В CoffeeScript нет явного трёхмерного выражения - вы просто используете обычный оператор , если в одной строке.

Если вы хотите сказать, что это в JavaScript:

!this.valid() ? 'disabled' : '' 

, то вы бы сказать, что это в CoffeeScript:

if [email protected]() then 'disabled' else '' 

и так "#{...}" работ с выражением:

className: "btn btn-primary #{if @valid() then 'disabled' else ''}"