2012-12-20 6 views
6

Mam zmienną mutedUser, który chciałbym, aby pozostał na innej funkcji. Mam problem z utrzymaniem zmiennej poza zdarzeniem kliknięcia. Jaki byłby najlepszy sposób na to, aby "return mutedUser" utrzymywał dodanie "wyciszonego" ciągu w oparciu o warunki instrukcji if? Dzięki!Problem z JavaScript zmienny zakres

* The console.log były mi sprawdzając, gdzie oporność zatrzymuje

this.isUserMuted = function isUserMuted(payload) { 
    var mutedUser = ''; 
    // If mute button is clicked place them into muted users list 
    // check for duplicates in list 
    $("#messages-wrapper").off('click', '.message button.muteButton'); 
    $("#messages-wrapper").on('click', '.message button.muteButton', function(e) { 

     $('#unMute').show(); 

     //create userId reference variable 
     var chatUserID = parseInt($(this).parent().parent().attr("data-type")); 

     //store userId in muted user object 
     mutedUsers[chatUserID] = {}; 
     mutedUsers[chatUserID].id = chatUserID; 
     mutedUsers[chatUserID].muted = true; 

     if (mutedUsers[chatUserID] !== null && mutedUsers[chatUserID].id === payload.a) { 
      console.log("user is now muted"); 
      mutedUser += ' muted'; 
      console.log(mutedUser + 1); 
     } 
     console.log(mutedUser + 2); 
    }); 
    return mutedUser; 
}; 
+0

jest if gdzie można sprawdzić, czy nie traci id pracy? poza tym możesz to zrobić i opublikować wynik: console.log (mutedUser + 'muted1'); –

Odpowiedz

5

Gdybym zrozumiał, co starasz się zrobić (patrząc na kod), to byłoby najlepsze podejście:

// If mute button is clicked place them into muted users list 
// check for duplicates in list 
$("#messages-wrapper").off('click', '.message button.muteButton'); 
$("#messages-wrapper").on('click', '.message button.muteButton', function(e) { 
    $('#unMute').show(); 

    //create userId reference variable 
    var chatUserID = parseInt($(this).parent().parent().attr("data-type")); 

    //store userId in muted user object 
    mutedUsers[chatUserID] = {}; 
    mutedUsers[chatUserID].id = chatUserID; 
    mutedUsers[chatUserID].muted = true; 
}); 

this.isUserMuted = function isUserMuted(payload) { 
    var mutedUser = ''; 

    if (mutedUsers[payload.a] !== null) { 
     mutedUser += ' muted'; 
    } 

    return mutedUser; 
}; 

kod zachowuje tablicę z mutedUsers i sprawdza, czy podany użytkownik znajduje się w tej tablicy. W kodzie który podałeś, należy założyć nową obsługi zdarzeń za każdym razem isUserMuted funkcja nazywa ..

Funkcja isUserMuted może być nawet skrócone do:

this.isUserMuted = function isUserMuted(payload) { 
    return mutedUsers[payload.a] !== null ? ' muted' : ''; 
}; 
+0

To by działało świetnie, jednak potrzebuję zmiennej "chatUserID" w zakresie this.isUserMuted funkcja. Dzieje się tak dlatego, że ta zmienna jest oparta na zdarzeniu kliknięcia, które sprawdza atrybut w kodzie HTML, który zostanie załadowany w – Yasir

+0

. W twojej implementacji 'chatUserID' jest faktycznie równy' payload.a', jeśli użytkownik jest naprawdę wyciszony (sądząc po twoim instrukcja - 'if (mutedUsers [chatUserID]! == null && mutedUsers [chatUserID] .id === payload.a)' i ta linia 'mutedUsers [chatUserID] .id = chatUserID;' wewnątrz obsługi kliknięcia) –

+0

ah! to działało, gdy ustawiłem to! = vs.! == dzięki za pomoc! – Yasir

3

Edycja

Niestety, mój błąd. Innym sposobem jest przekazanie w tej zmiennej, tzn

this.isUserMuted = function isUserMuted(payload, isMuted) { 
    isMuted = ''; 
    // If mute button is clicked place them into muted users list 
    // check for duplicates in list 
    $("#messages-wrapper").off('click', '.message button.muteButton'); 
    $("#messages-wrapper").on('click', '.message button.muteButton', function(e) { 

     $('#unMute').show(); 

     //create userId reference variable 
     var chatUserID = parseInt($(this).parent().parent().attr("data-type")); 

     //store userId in muted user object 
     mutedUsers[chatUserID] = {}; 
     mutedUsers[chatUserID].id = chatUserID; 
     mutedUsers[chatUserID].muted = true; 

     if (mutedUsers[chatUserID] !== null && mutedUsers[chatUserID].id === payload.a) { 
      console.log("user is now muted"); 
      isMuted += ' muted'; 
      console.log(mutedUser + 1); 
     } 
     console.log(mutedUser + 2); 
    }); 
    return isMuted; 
}; 
+0

W rzeczywistości twoja pierwotna wersja była lepsza. Nowa wersja nie działa. –

+0

Wiesz, co masz rację. Ale zwykle widzę to jako wzorzec modułów, np. Http://jsfiddle.net/VpAPP/ – redconservatory

+1

Działa tylko wtedy, gdy zwrócisz obiekt, a nie skalar. –

2

nie można. Jeśli zwrócisz ciąg znaków z funkcji, zawsze będzie przekazywany przez wartość, tj. Kopiowany; i jego wartość już się nie zmieni. Powinieneś zwrócić funkcję, która może uzyskać dostęp do bieżącej wartości zmiennej lokalnej lub obiektu ze zmieniającą się właściwością.

Gdy już wydaje się, że obiekt, opcja # 2 zmieści się dobrze tutaj:

function User() { // or whatever you have 
    … 

    var user = this; 
    // If mute button is clicked place them into muted users list 
    // check for duplicates in list 
    $("#messages-wrapper").on('click', '.message button.muteButton', function(e) { 

     $('#unMute').show(); 

     //store userId in muted user object 
     mutedUsers[user.id] = user; 
     user.muted = true; 
    }); 
    this.muted = false; 
    this.isUserMuted = function() { 
     return this.muted ? ' muted' : ''; 
    } 
}