Underscore.js некоторые не возвращают логическое значение

Я использую underscore.js, чтобы проверить, является ли элемент истинным в списке. Вот код coffeescript для него:

uploading  = _(@getViews ".file-forms").some (view) ->
    view.uploading is true

печать «загрузка» вместо возврата true или false дает:

uploading
  y
   _chain: true
   _wrapped: false
   __proto__: Object

Вот определение слова «некоторые» для подчеркивания: http://underscorejs.org/#some.

Кроме того, getViews — это функция из магистрального менеджера компоновки, определенная здесь: https://github.com/tbranyen/backbone.layoutmanager/wiki/Nested-views

Вот вывод других переменных, которые могут упростить отладку:

_(this.getViews(".file-forms"))
 y
  _chain: true
  _wrapped: Array[1]
  0: d
  length: 1
  __proto__: Array[0]
  __proto__: Object

_
 function (a){if(a instanceof y)return a;if(this instanceof y)this._wrapped=a;else return new y(a)}

person zimkies    schedule 30.01.2013    source источник
comment
Можете ли вы показать свой выходной javascript? Похоже, он звонит chain() без value()   -  person Plynx    schedule 31.01.2013
comment
Я печатаю его с помощью console.log(загрузка) (с выводом, как показано выше). Под «выходным javascript» вы подразумеваете javascript, созданный путем компиляции coffeescript? Вы можете увидеть его, просто скопировав кофейный скрипт сюда: coffeescript.org в разделе "Попробуйте Coffeescript".   -  person zimkies    schedule 31.01.2013
comment
В javascript/подчеркивании все работает нормально. У вас проблема либо с coffeescript, либо с магистралью. Можете ли вы показать результаты getViews и буквального _ в вашей среде?   -  person Plynx    schedule 31.01.2013
comment
Ага, добавил к вопросу   -  person zimkies    schedule 31.01.2013


Ответы (2)


Если вы посмотрите на getViews, вы посмотрю, что происходит:

getViews: function(fn) {
  //...
  if (typeof fn === "string") {
    return _.chain([this.views[fn]]).flatten();
  }
  //...
}

Если вы посмотрите на все возможные возвращаемые значения, вы увидите, что все они являются результатом вызовов _.chain без вызова _.value для отделения оболочки цепочки. Это означает, что getViews возвращает оболочку Underscore с цепочкой, а не простой массив, который вы ожидаете.

Вы не должны делать _(@getViews '...'), так как возвращаемое значение getViews уже заключено в подчеркивание. Вместо этого вы должны сделать что-то вроде этого:

uploading = @getViews(".file-forms").some((view) -> view.uploading is true).value()

Кстати, я немного подозрительно отношусь к вашему тесту v.uploading is true; явные проверки true и false могут привести к странному поведению (особенно в CoffeeScript, где is на самом деле ===). Вместо этого я бы, вероятно, использовал (v) -> v.uploading в качестве функции. Конечно, это личные предпочтения.

person mu is too short    schedule 31.01.2013

getViews, кажется, возвращает предварительно упакованный и связанный по цепочке объект подчеркивания для вашего потребления. Повторный вызов _ в этом случае ничего не дает. Вы можете поставить uploading.value(), чтобы получить желаемый результат.

person Plynx    schedule 31.01.2013