CoffeeScript всегда возвращается в анонимной функции - PullRequest
4 голосов
/ 12 августа 2011

Я пытаюсь написать какую-нибудь функцию CoffeScript, которая проверяет все флажки в таблице после установки флажка в th.

Моя функция в CoffeeScript выглядит следующим образом:

$("table.tableview th input:checkbox").live 'click', -> 
  checkedStatus = this.checked
  $("table.tableview tbody tr td:first-child input:checkbox").each ->
      this.checked = checkedStatus

Это прекрасно работает для проверки всех флажков.Однако при снятии флажка это не работает.Скомпилированный JS выглядит следующим образом:

$("table.tableview th input:checkbox").live('click', function() {
  var checkedStatus;
  checkedStatus = this.checked;
  return $("table.tableview tbody tr td:first-child input:checkbox").each(function() {
    return this.checked = checkedStatus;
  });
});

Он не работает, потому что после того, как для первого установлено значение false, возвращение функции будет ложным.Я, однако, понятия не имею, как подавить это поведение возврата по умолчанию сценария кофе.Пожалуйста помоги.

Когда я добавляю "true" в соответствии с предложением Фламбино, я получаю следующий JS

  $("table.tableview th input:checkbox").live('click', function() {
    var checkedStatus;
    checkedStatus = this.checked;
    $("table.tableview tbody tr td:first-child input:checkbox").each(function() {
      return this.checked = checkedStatus;
    });
    return true;
  });

Единственный способ получить выражение return внутри функции - это поместить его полностьюкак это:

    $("table.tableview tbody tr td:first-child input:checkbox").each ->
      this.checked = checkedStatus
                        true

Что я делаю не так?Спасибо за помощь до сих пор

Ответы [ 2 ]

19 голосов
/ 14 августа 2011

Если вы просто используете return (или, что то же самое, undefined) в качестве последней строки функции, компилятор CoffeeScript выдаст вам JS без return.Поэтому наиболее эффективным способом написания вашего кода будет

$("table.tableview th input:checkbox").live 'click', -> 
  checkedStatus = this.checked
  $("table.tableview tbody tr td:first-child input:checkbox").each ->
    this.checked = checkedStatus
    return
  return

(Конечно, вы можете безопасно обойтись без второго return. В jQuery действует только возвращаемое значение false)

Был также предложен синтаксис (-/>) для определения функции без возвращаемого значения;см. выпуск 899 .

5 голосов
/ 12 августа 2011

Просто добавьте true в качестве последней строки вашей функции, и coffeescript скомпилирует JS, чтобы получить вместо этого:

$("table.tableview th input:checkbox").live 'click', -> 
    checkedStatus = this.checked
    $("table.tableview tbody tr td:first-child input:checkbox").each ->
        this.checked = checkedStatus
    true

Другими словами, CoffeeScript всегда возвращает результат последней строки(как это делает Руби)


Редактировать (после обновления вопроса):

Опять же, вы не можете удерживать CoffeeScript от возврата значения последнегострока в функции - часть сути CoffeeScript заключается в том, что он делает именно это.

CoffeeScript имеет значительные пробелы, поэтому отступы - это то, что говорит о том, что принадлежит друг другу - ваш пример на самом деле правильный:

$("table.tableview th input:checkbox").live 'click', -> 
    checkedStatus = this.checked
    $("table.tableview tbody tr td:first-child input:checkbox").each ->
        this.checked = checkedStatus
        true // cause this function (the each-iterator) to return true
    true // causes the click handler function to return true

Нет никакой разницы между этим и простым написанием return true в функции, как в javascript.Вы просто используете пробелы вместо {} для создания блоков кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...