下划线.js "some"不返回布尔值



我正在使用下划线.js来检查列表中的元素是否为真。这是它的咖啡脚本代码:

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

打印"上传",而不是返回真或假,给出:

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)}

如果你看一下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测试有点怀疑;对truefalse的显式检查可能会导致奇怪的行为(特别是在CoffeeScript中,is真的很===)。我可能会使用 (v) -> v.uploading 作为函数。当然,这是个人喜好。

getViews似乎返回了一个预先包装并链接的下划线对象供您使用。在这种情况下,再次调用_没有任何作用。您可以投入uploading.value()以获得所需的结果。

最新更新