2

我正在使用 jQuery 循环遍历数组并将每个值与模型的用户 ID 进行比较。如果找到匹配项,我只会显示特定文本。

$.each current_user.get('following_ids'), (i, e) =>
  console.log(@model.get('user')._id == e)
  if @model.get('user')._id == e
    @is_following = true
    //break from loop if condition is met
    return false
  else
    @is_following = false
    //else continue looping through
    return true

if @is_following
  $(@el).find('.user_info .follow a').text "following"
else
  $(@el).find('.user_info .follow a').text "follow"

但是我的代码不起作用,它总是返回我“关注”文本。我在这里做错了什么?

4

2 回答 2

1

大概current_user.get('following_ids')是某种ID数组。立即想到两种可能性:

  1. current_user.get('following_ids')不包含@model.get('user')._id所以一切都按预期工作。
  2. 你有类型问题。也许following_ids是一个字符串数组并且_id是一个数字,反之亦然。

选项2需要更多解释:CoffeeScript==被转换为 JavaScript ===,所以1 == '1'在 CoffeeScript 中为假,但在 JavaScript 中为真。这确实使2成为1的隐藏且可能令人惊讶的变体,但它的特殊性足以成为它自己的情况。

考虑一下您的情况的这种简化模拟:

$.each ['1','2','3'], (i, e) =>
    if 2 == e
        @is_following = true
        return false
    else
        @is_following = false
        return true
console.log @is_following

你会摆脱false它,因为2 == '2'false是 CoffeeScript:http: //jsfiddle.net/ambiguous/YsstH/

但是,如果我们修复类型:

$.each [1,2,3], (i, e) =>
    # Only the array changes...
console.log @is_following

然后我们得到true我们期望的结果:http: //jsfiddle.net/ambiguous/CxHXu/


无论如何,由于您使用的是 Backbone,因此您有下划线,因此您可以使用_.any

@is_following = _(current_user.get('following_ids')).any (id) => @model.get('user')._id == id

或更好:

want_this_id  = @model.get('user')._id
@is_following = _(current_user.get('following_ids')).any (id) -> want_this_id == id

不过,您仍然必须解决类型问题。

于 2012-06-04T03:37:22.467 回答
0

最有可能的是,您在找到匹配项后会覆盖结果。如果您找到了匹配项,则无需继续检查。

$.each current_user.get('following_ids'), (i, e) =>
  unless @is_following
    console.log(@model.get('user')._id == e)
    if @model.get('user')._id == e
       @is_following = true
      //break from loop if condition is met
      return false
    else
      @is_following = false
      //else continue looping through
      return true

if @is_following
  $(@el).find('.user_info .follow a').text "following"
else
  $(@el).find('.user_info .follow a').text "follow"
于 2012-06-04T03:25:33.163 回答