我使用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"
但是我的代码无效,它总是返回“跟随”文本。我在这里做错了什么?
答案 0 :(得分:1)
据推测,current_user.get('following_ids')
是某种ID数组。立即想到两种可能性:
current_user.get('following_ids')
不包含@model.get('user')._id
,因此一切正常运作。following_ids
是一个字符串数组,_id
是一个数字,反之亦然。选项 2 需要更多解释:CoffeeScript的==
转换为JavaScript的===
,因此在CoffeeScript中1 == '1'
为false,但在JavaScript中为true。这确实使 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,因此您可以使用Underscore,因此您可以使用_.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
你仍然需要解决类型问题。
答案 1 :(得分: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"