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 の配列です。次の 2 つの可能性がすぐに思い浮かびます。

  1. current_user.get('following_ids')含まれていない@model.get('user')._idため、すべてが期待どおりに機能しています。
  2. タイプに問題があります。おそらく、following_idsは文字列の配列であり_id、数値であるか、またはその逆です。

オプション2については、もう少し説明が必要です。CoffeeScript==は JavaScript に変換される===ため1 == '1'、CoffeeScript では 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

それはCoffeeScriptfalseであるため、あなたはそれから抜け出すでしょう: http://jsfiddle.net/ambiguous/YsstH/2 == '2'false

しかし、型を修正すると:

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

次に、true期待どおりの結果が得られます: http://jsfiddle.net/ambiguous/CxHXu/


いずれにせよ、バックボーンを使用しているため、アンダースコアがあるため、次を使用できます_.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 に答える