2016-05-13 14 views
1

Hallo, ich bin selbst lernen, MEAN Stack und habe eine Frage, wie Sie die Menge von, wenn Checks in meinem Code zu reduzieren.wie ich die Menge der if-Anweisungen reduzieren kann

Grundsätzlich funktioniert der Benutzer füllt seine/ihre Einstellungen Seite dann klickt geben Sie ein, wir senden Sie die Daten an den Server, damit wir Mongo aktualisieren können.

die einzige Möglichkeit, dass ich dies zu arbeiten scheint, dass der Benutzer bestimmte Felder bearbeiten kann und nicht alle ist, um sicherzustellen, dass die Daten an den Server nicht gleich null gesendet werden, aber sicherlich muss es einen besseren Weg geben dann durch Ausführen von if-Anweisungen für jedes Feld.

der Code in Frage ist

 //user.username = req.body.username; 

    if (age != null) { 

     user.age = age; 

    } 
    if (bio != null) { 

     user.bio = bio; 

    } 

    if (location != null) { 

     user.location = location; 

    } 

    if (team != null) { 

     user.team = team; 

    } 

    if (tags != null) { 

     user.tags = tags; 

    } 

    if (email != null) { 

     user.email = email; 

    } 

Client-Seite Code

$scope.savesettings = function(provider){ 
    var theUser = JSON.parse(localStorage.getItem("User-Data")); 
    var user = theUser["_id"]; 
    var request = {}; 
    var request = { 

     user: user, 
     username: $scope.settings_username, 
     email: $scope.settings_email, 
     age: $scope.settings_age, 
     location: $scope.settings_location, 
     team: $scope.settings_team, 
     bio:$scope.settings_bio, 
     profilebanner: $scope.settings_profilebanner, 
     avatar: $scope.settings_avatar 

    }; 

    console.log(request); 

    //send to server 
    $http.put('api/social/updatesettings', request).success(function(response){ 

     alertify.success("Your settings have been successfully saved."); 

      localStorage.clear(); 
      localStorage.setItem('User-Data', JSON.stringify(response)); 



    }).error(function(error){ 

     alertify.error("Hmmm an issue has occured."); 

    }); 


}; 

Servercode

var User = require('../../datasets/userModel'); 

module.exports.updatesettings = function (req, res) {

var age = req.body.age; 
    var bio = req.body.bio; 
    var location = req.body.location; 
    var team = req.body.team; 
    var tags = req.body.tags; 
    var email = req.body.email; 
    var profilebanner = req.body.profilebanner; 
    var avatar = req.body.avatar; 

User.findOne({_id: req.body.user}, function (err, user){ 


    //user.username = req.body.username; 

    if (age != null) { 

     user.age = age; 

    } 
    if (bio != null) { 

     user.bio = bio; 

    } 

    if (location != null) { 

     user.location = location; 

    } 

    if (team != null) { 

     user.team = team; 

    } 

    if (tags != null) { 

     user.tags = tags; 

    } 

    if (email != null) { 

     user.email = email; 

    } 

    user.save(function(err){ 

     if (err){ 
      console.log(err); 
      res.status(500).send(); 
      //res.json(user); 
     } else { 
      console.log("success"); 
      res.json(user); 
     } 
    }) 
}); 

};

+0

Wo zuweisen Sie die Variablen aus? Zum Beispiel "if (age! = Null)", woher kommt "age"? – chridam

+0

Haben Sie darüber nachgedacht, alle Felder in einem Array zu verpacken und dann die Methode forEach() auszuführen, führt dies zu weniger Code, da Sie nur eine if-Anweisung haben. –

+0

wird es jetzt in Mate hinzufügen –

Antwort

0

Sie können alle Attribute zum Benutzerobjekt hinzufügen.

var user = { 
    age: age, 
    bio: bio, 
    location: location 
} 

Und dann löschen Sie Schlüssel für Nullwerte.

for (var key in user) { 
    if (user[key] === null) { 
     delete user[key]; 
    } 
} 
2

Verwenden Sie Object.assign. Es führt zwei oder mehr Objekte zusammen, wobei letztere Vorrang haben. Folgendes ist angenommen: data ist ein Objekt, das Ihre age, bio usw. enthält und user ist, also ... Ihr user Objekt.

var results = Object.assign({}, user, data); 

Es gibt polyfills für diese, und wenn Sie jQuery verwenden passieren, $.extend meist macht die gleiche Arbeit.

0

Wie über eine Funktion, in der Sie eine Reihe von Variablen übergeben und some verwenden, um festzustellen, ob einer von ihnen null ist.

function isComplete(args) { 
    return !args.some(function(el) { 
    return el === null; 
    }); 
} 

var age = null; 
var bio = 'Something'; 
var location = null; 

isComplete([age, bio, location]); // false 
0

Die if s sind nicht das Problem. Das Problem ist, dass Sie dem Benutzer Felder anzeigen, die er nicht sehen soll. Das Problem liegt also in der Präsentationsebene.

Das Reparieren dieser Serie von if s ist wie Staub unter den Teppich kehren, es scheint, als ob Sie Rollen für Ihre Benutzer wollen, also machen Sie das klar und verständlich in Ihrem Code.

Sie können dieses Problem beheben mit Server-Seite erzeugt HTML, so etwas wie dieses (Syntax könnte falsch sein, aber ich hoffe, Sie erhalten den Punkt):

<% if (user.canSetTeam()) { %> 
    <input type="text" name="team" /> 
<% } %> 

Also in Ihrem HTML Sie nur die richtigen Felder haben.

Werfen Sie einen Blick auf http://expressjs.com/en/guide/using-template-engines.html

Verwandte Themen