web-dev-qa-db-fra.com

Modèles de carlin - Comment marquer une option dans la liste déroulante comme sélectionnée

J'ai un modèle Pug qui utilise Bootstrap 4 comme "mise en page" et qui reçoit des données d'un serveur Express/Mongoose.

Je remplis un formulaire à partir de MongoDB afin que le contenu puisse être modifié. Je cherchais un moyen de créer une liste déroulante en sélectionnant une option en fonction de la valeur du document mongoDB.

J'ai vu des moyens de construire la liste déroulante à partir de zéro et de définir une option sur 'sélectionnée', mais le formulaire est déjà généré et une liste déroulante est déjà en place. J'ai juste besoin de faire correspondre l'option avec la valeur du document mongoDB et de définir l'option à afficher dans la liste.

Le modèle Pug est comme suit:

.row
  .col-sm-6
    .form-group
      label.control-label.requiredField(for='propertyType')
        | Property Type
        span.asteriskField *
      .col-xs-12
        select#propertyType.select.form-control.input-lg(form='addProperty', name='propertyType')
          option(value='0') -- Select --
          option(value='6') Home
          option(value='7') Condo
          option(value='10') Single Family Home
          option(value='11') Town House
          option(value='12') City Apartment
          option(value='13') Villa


script.
  var propertyType = document.getElementById('propertyType');

  for (var i = 0; i < propertyType.options.length; i++) {

    if (propertyType.options[i].value = #{property.typeId}) {
        propertyType.options[i].selected = 'selected';
        propertyType.selectedIndex = i;
        break;
    }

  }

Si je conserve le code tel qu'il est répertorié, l'option qui donne une nouvelle valeur est la première '- Select -' dont la valeur est modifiée de '0' à '6', qui correspond à la valeur du document MongoDB.

Si je change le javascript pour passer la valeur # {property.TypeId} au 'selectedIndex' comme ceci:

propertyType.selectedIndex = #{property.typeId};

Ensuite, la valeur de l'index change et l'option "sélectionné" change - en "6", ce qui sélectionne ensuite la 6ème option des options et non celle ayant la valeur "6".

Les listes déroulantes étant la seule chose que je n'arrive pas à peupler, toute aide serait grandement appréciée.

7
Pandafinity

METTRE &AGRAVE; JOUR

J'espère que ça va pour répondre à ma propre question. J'ai essayé l'approche de Mohit, mais cela n'a pas fonctionné pour moi.

J'ai ajouté un "script". section sous chaque <select> entrée:

script.
  var pOptions = document.getElementById('propertyType').options;
  for (i=0; i < pOptions.length; i++) {
    if (pOptions[i].value == #{property.typeId}) pOptions[i].selected = true;
  }
3
Pandafinity

Si vous avez juste besoin d'afficher une option présélectionnée, alors je ne pense pas que vous ayez besoin d'utiliser javascript pour cela. Vous pouvez essayer ceci:

.row
  .col-sm-6
    .form-group
      label.control-label.requiredField(for='propertyType')
        | Property Type
        span.asteriskField *
      .col-xs-12
        select#propertyType.select.form-control.input-lg(form='addProperty', name='propertyType')
          option(value='0', selected= true) -- Select --
          option(value='6', selected= property.id == 6) Home
          option(value='7', selected= property.id == 7) Condo
          option(value='10', selected= property.id == 10) Single Family Home
          option(value='11', selected= property.id == 11) Town House
          option(value='12', selected= property.id == 12) City Apartment
          option(value='13', selected= property.id == 13) Villa

En supposant que cette liste déroulante affiche les valeurs correspondant à property.id, elle marque l'attribut selected comme étant vrai pour la variable option dont la valeur correspond à la valeur dans property.id. Sinon, la première option sera affichée sélectionnée par défaut.

14
Mohit Bhardwaj

J'ai utilisé la réponse de Mohit Bhardwaj dans une boucle for pour une solution simple.

select(name='image')
  option(value='' selected=!project.image) (empty)
  for img in images
    option(value=img.id selected=(img.id === project.image.id)) #{img.alt}
6
sshow

Voici un moyen de le faire sans requérir de balise de script ni déployer la boucle. 

-var selected = true;
select(id=field.id required=required)
    each op in field.options
        option(value=op name=field.name selected=selected) #{op}
        -if(selected){
            -selected=false;
        -}

Cela définira la toute première option de la liste sur "sélectionné" en utilisant la syntaxe de définition d'attribut (si selected est vrai lorsque évalué selected=selected, il ajoutera la balise). 

0
Mark B
              here is index.pug
              /////////////////////   

           extends layout


           block content
           h1= title
           //- p Welcome to #{title}
         style.
         input[type=text], select {
         width: 20%;
         padding: 12px 20px;
         margin: 8px 0;
         display: inline-block;
         border: 1px solid #ccc;
         border-radius: 4px;
         box-sizing: border-box;
          }
       input[type=submit] {
       width: 10%;
       background-color: #4CAF50;
       color: white;
       padding: 14px 20px;
       margin: 8px 0;
       border: none;
       border-radius: 4px;
       cursor: pointer;
        }
       input[type=submit]:hover {
       background-color: #45a049;
       }
     div {
      border-radius: 1px;
      background-color: #f2f2f2;
      padding: 20px; }
     link(rel='stylesheet', href='/scripts/css/bootstrap.css')
     script(src="/scripts/js/bootstrap.min.js")
     //-      //- 

       script(src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js")
       script(src="/jquery/jquery.js")
       h3 Choose Your Skill
       - var  optos = skills
 div
    form(action='/Skill' method="post")
 div
    label Enter- 
    input(type='text',id='zaftot',name="zaftot" ,onKeyup="myFunc(this.value)"         
    autofocus="autofocus") 
    input(type='submit',  value='Submit')  
 div   

    select(name='dropdown' id="myselect" size="4" ,onClick="myclick()",style="margin- 
    left:40px" )


    script.
          function myclick(){ 
          var t=$("#myselect").val().toString();
          $("#zaftot").val(t);
          $("#zaftot").focus();
          $("#myselect").hide();
        /// alert(t);
         };
     function memo(){ 
       /// remove  all items of list
        var x = document.getElementById("myselect");
        while(true){ 
        if (x.length > 0) {
          x.remove(x.length-1);
               }
               else{
                 break;
               }
             }
          }

     function myFunc(inp){
        $("#myselect").show();

          memo(); //clear list before initiatig new one
       if (inp.length >0){
        //alert(inp +'----hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh');
        var aa =!{JSON.stringify(optos)}
        var uu =inp.trim().toLowerCase();
         for (i = 0; i < aa.length; i++) {
          var  tt =aa[i].trim().toLowerCase();
          //var y =tt.substr(0,uu.length);
          //alert(uu);
          //if(tt.substr(0,uu.length))===uu {  // substr() not working i dont know
            if(tt.indexOf(uu)>-1){ 
              $('#myselect').append('<option>' + aa[i] + '</option>');
            };
         };
     };
    };
     ////////////////////////////////////////////////////

          here is  routes /index.js  
          /////////////////////////////

        /*esversion=6 */
        var express = require('express');
        var router = express.Router();

       router.get("/", function (req, res) {
        var  skills =["MVC", "C#", "mmm","mlll","moo","muuu" 
        ,"mdd","mkkkk","Node  
        JS", 
       "mkyy" ,  "Python" ,  "IDE visual studio","Mssql"];
        res.render('index', {
          title : "Select technology",
         skills:skills
        });
       });

     router.post("/Skill" , function(req, res){
     console.log(req.body);
     res.render('Skill',{
     skill: req.body.dropdown
     });
     });

    module.exports = router;
        //////////////////////////////////////
           package json
          {
         "name": "aziz",
            "version": "0.0.0",
            "private": true,
          "scripts": {
           "start": "nodemon ./bin/www"
         },
         "dependencies": {
         "bootstrap": "^4.1.3",
         "cookie-parser": "~1.4.3",
         "debug": "~2.6.9",
        "eslint": "^5.5.0",
         "express": "~4.16.0",
         "http-errors": "~1.6.2",
        "jquery": "^3.3.1",
        "morgan": "~1.9.0",
        "nodemon": "^1.18.4",
         "popper.js": "^1.14.3",
         "pug": "2.0.0-beta11"
        },
      "author": "azizsallam",
       "license": "ISC"
        }     
        ///////////////////////////
         add these two line to app.js

 ////////////ADD TO APP.JS the next line how to call bootstrap files in yuor          
            ///////////////////  the next line how to call bootstrap files 
 in yuor view ///////////////////
 app.use('/scripts', express.static(__dirname + 
 '/node_modules/bootstrap/dist/'));
 app.use('/jquery', express.static(__dirname + 
 '/node_modules/jquery/dist/'));
   //////////////////////////////////
0
aziz sallam

En regardant la documentation ici j'ai trouvé une solution qui ne nécessite pas de javascript et qui fonctionne en ligne.

Voici comment je l'ai utilisé dans mon code:

select(name="priority")
    each priority in priorities
        option(value=priority.id selected=(job.priority.id == priority.id) ) #{priority.name}
0
K Rob