Соединение Coffeescript Underscore.js и Backbone.js вместе - PullRequest
4 голосов
/ 12 марта 2012

TLDR; http://jsfiddle.net/squarism/zaVrE/

Я новичок в Backbone.js и Underscore.js (Подчеркивание, я думаю, включено в Backbone).Я использую это в приложении rails, но этот кусочек не имеет / не должен иметь значения.Я слежу за Railscast, состоящим из двух частей, о магистральной линии.Я пытаюсь получить подчеркивание, основную часть, coffeescript, отладку и все документы.К путанице добавляются различия между Underscore API и версией coffeescript.

Например: у меня есть массив объектов User в виде «записей».У каждого есть атрибут победителя.Так что это будет работать:

# why does this return everyone?
non_winners = @select(entries) ->
  @get('winner') == false

Так что здесь много чего происходит.@Select от подчеркивания.@Get от позвоночника.И все это - coffeescript.Перевод этого в строку отладки JS немного сумасшедший.В конце концов, хотя я разобрался с javascript вне магистрали, чтобы проверить это.Моя проблема в документах:

В документах говорится:

filter_.filter(list, iterator, [context]) Alias: select 

Я не знаю, как это читать.Я просто назвал @select, который, по моему мнению, приравнивается к .select (), но я не дал ему итератор.В Javascript на консоли браузера он возвращает массив только с объектами, где winner равно false.В моем приложении, если я console.log (non_winners), он возвращает мне всех, но console.log (non_winners.length) соответствует тому, что я ожидал (т.е., если у меня один победитель, это 1).Это несоответствие действительно сбивает с толку, пока я учусь.

entries = [
  { name: 'Joe', winner: false },
  { name: 'Bob', winner: false },
  { name: 'Henry', winner: true }
]

# here's an example from my app
#non_winners = @select (entries) ->
#  @get('winner') == false

# here's an example from the API
#evens = _.filter [1..6], (num) -> num % 2 is 0

# here's something that works
non_winners = _.select entries, (entry) ->
  entry.winner is true

Я нахожу несколько странных вещей:

  1. Как люди на самом деле отлаживают эту сумасшедшую комбинацию.Coffeescript, Underscore, Backbone, о мой!Пока я все не понимаю, я бы хотел поиграть с этим.JSfiddle (ниже) хорош, но есть ли надежда на использование консоли браузера?
  2. Как вы переводите этот бизнес @select () (@ является правильным псевдонимом coffeescript, который указывает на коллекцию Backbone?) В_.select () api docs подчеркивания?Порядок аргумента другой.
  3. В приведенном выше примере (и в скрипте ниже) возвращается только один человек.Но в моем приложении все люди возвращаются.
  4. Я могу заставить одного человека быть возвращенным в скрипке, но синтаксис отличается от примеров в railscast (# 323).
  5. код, который работает в скрипте, все еще действительно не соответствует документам подчеркивания API.Я хотел бы научиться читать документы по подчеркиванию (научиться ловить рыбу против одной рыбы и т. Д.).

Вы можете увидеть это в действии: http://jsfiddle.net/squarism/zaVrE/

1 Ответ

6 голосов
/ 13 марта 2012

Из скрипки не совсем понятно, в чем ваша проблема в реальном коде. Я думаю, что основной проблемой здесь является @get('winner'), что эквивалентно this.get('winner'). Вы вызываете метод коллекции вместо метода ввода. @ является просто заменой this (или this. в случае функций). Ваш код должен быть

non_winners = @select (entry) ->
  entry.get('winner') == false

_ - это просто объект со множеством методов (включая select). Объекты коллекции Backbone.js включают в себя методы Underscore.

Что касается отладки, то в большинстве случаев тривиально сопоставить JS в браузере с вашим кодом CoffeeScript. Иногда вывод JS не соответствует ожиданиям из-за смещенного отступа или отсутствия скобок. Это тоже легко отлаживать - просто посмотрите на вывод JS.

Underscore.js и Backbone.js - это просто библиотеки JS, поэтому вы можете проверить (или отладить) их код. Это довольно чисто и просто.

...