2012-12-20 14 views
6

Ich habe eine Variable muteedUser, die ich gerne zu einer anderen Funktion erhalten würde. Ich habe ein bisschen Probleme mit der Variablen, die außerhalb des Klickereignisses besteht. Was wäre der beste Weg, um es so zu haben, dass der "return muteedUser" die "gedämpfte" String-Addition basierend auf den Bedingungen der if-Anweisung beibehalten würde? Vielen Dank!Problem mit Javascript Variable Scope

* Die console.log des prüften mich, um zu sehen, wo die persistance

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

die if-Anweisung ist, wo Sie für die nicht null überprüfen und die ID zu arbeiten? Außerdem können Sie dies tun und das Ergebnis posten: console.log (mutedUser + 'muted1'); –

Antwort

5

Wenn ich verstand, was Sie (mit Blick auf dem Code) zu tun versuchen, dies wäre der beste Ansatz:

// 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; 
}; 

Die Code behält das Array von mutedUsers und isUserMuted Funktion überprüft, ob Benutzer in diesem Array zur Verfügung gestellt wird. Im Code, den Sie zur Verfügung gestellt, würden Sie einen neuen Event-Handler jedes Mal isUserMuted Funktion aufgerufen wird ..

Die isUserMuted Funktion befestigen sogar verkürzt werden konnte:

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

Das hätte großartig funktioniert, aber ich brauche die Variable "ChatUserID" im Rahmen dieser .isUserMuted-Funktion. Dies liegt daran, dass diese Variable auf einem Klick-Ereignis basiert, das ein Attribut innerhalb des geladenen HTML-Codes überprüft. – Yasir

+0

In Ihrer Implementierung ist 'chatUserID' praktisch gleich 'payload.a', wenn der Benutzer wirklich stummgeschaltet ist (nach Ihrem if Anweisung - 'if (muteedUsers [chatUserID]! == null && muteedUsers [chatUserID] .id === Payload.a)' und diese Zeile 'muteedUsers [chatUserID] .id = chatUserID;' innerhalb des Click-Handlers) –

+0

ah! das hat funktioniert, sobald ich es eingestellt habe! = vs.! == danke für deine hilfe! – Yasir

3

bearbeiten

Sorry, mein Fehler stoppt. Ein anderer Weg ist in diesen Variablen zu übergeben, das heißt

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

Eigentlich war deine Originalversion besser. Die neue Version funktioniert nicht. –

+0

Sie wissen, was Sie richtig sind. Aber ich sehe das normalerweise als ein Modul-Muster, also etwas wie http://jsfiddle.net/VpAPP/ – redconservatory

+1

Es funktioniert nur, wenn Sie ein Objekt zurückgeben, kein Skalar. –

2

Sie können nicht. Wenn Sie eine Zeichenfolge von der Funktion zurückgeben, wird sie immer als Wert übergeben, d. H. Kopiert; und sein Wert wird sich nicht mehr ändern. Sie müssten eine Funktion zurückgeben, die auf den aktuellen Wert der lokalen Variablen zugreifen kann, oder ein Objekt mit einer Eigenschaft, die sich ändert.

Wie Sie bereits scheinen, ein Objekt zu haben, Option # 2 wird hier gut passen:

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' : ''; 
    } 
}