2012-06-04 3 views
2

Я использую jQuery для циклического преобразования массива и сравнения каждого значения с идентификатором пользователя модели. Я буду показывать только конкретный текст, если совпадение найдено.Ошибка цикла через цикл и нарушение при выполнении условия

$.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" 

Однако мой код не работает, он всегда возвращает мне текст «follow». Что я здесь делаю неправильно?

ответ

1

Предположительно current_user.get('following_ids') - это своего рода массив идентификаторов. Две возможности сразу же приходят на ум:

  1. current_user.get('following_ids') не содержит @model.get('user')._id так, что все работает, как ожидалось.
  2. У вас есть проблема типа. Возможно, following_ids представляет собой массив строк, а _id - это число или наоборот.

Вариант нужно немного больше объяснений: CoffeeScript-х == преобразуется в JavaScript-х ===1 == '1' так ложна в CoffeeScript, но верно в JavaScript. Это делает скрытым и, возможно, неожиданным вариантом , но достаточно для того, чтобы быть его собственным делом.

Рассмотрим упрощенный аналог вашей ситуации:

$.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 

Вы» d все равно придется разобраться в проблеме типа.

+0

. Я хочу, чтобы я мог увеличить ваш ответ несколько раз. Спасибо, что вы нажмете гвоздь на голове! Также любите свое альтернативное решение, настолько чище и эффективнее. Спасибо большое! – Zhen

+0

@Zhen: Не беспокойтесь, иногда мне нравятся головоломки :) –

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" 
+0

И для записи 'false' не ломается -' break' делает. – Swift

+0

Для записи 'false' действительно ломается: [« Мы можем разбить цикл '.each()' на конкретной итерации, возвращая функцию обратного вызова 'false'.] (Http://api.jquery.com /jQuery.each/) –

+0

Я получаю сообщение об ошибке, если я использую «break» – Zhen

Смежные вопросы