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 е функция от backbone layoutmanager, дефинирана тук: 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(uploading) (с изход, както е показано по-горе). Под „изходен javascript“ имате предвид javascript, произведен от компилирането на coffeescript? Можете да го видите, като просто копирате и поставите 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 връща верижна обвивка на долна черта, а не простия масив, който очаквате.

Не трябва да правите _(@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