2017-03-24 2 views
1

Dans un formulaire j'ai 2 entrées. Dans la 1ère entrée j'utilise un datalist que je charge par JSON et la 2ème entrée est autocomplete quand la 1ère entrée est changée.Contenu de saisie semi-automatique de popover bootstrap à partir de JSON

Jusqu'à ici tout fonctionne bien!

J'ai ajouté un nouveau bouton, que j'utilise popover de bootstrap dont je veux afficher du texte en fonction de la sélection de l'utilisateur (comme ci-dessus). Le texte que je veux montrer est l'information de l'élément labels.

Je lis un facteur pertinent question mais je ne l'ai pas réussi jusqu'à maintenant ..

var dataList = $('.products'); 
 
var jsonOptions = [{ 
 
    "product": "11111", 
 
    "description": "description 1", 
 
    "labels": [{ 
 
    "version": "01", 
 
    "quantity": 500 
 
    }, { 
 
    "version": "02", 
 
    "quantity": 800 
 
    }, ] 
 
}, { 
 
    "product": "22222", 
 
    "description": "description 2", 
 
    "labels": [{ 
 
    "version": "01", 
 
    "quantity": 900 
 
    }, { 
 
    "version": "02", 
 
    "quantity": 100 
 
    }, ] 
 
}, { 
 
    "product": "33333", 
 
    "description": "description 3", 
 
    "labels": [{ 
 
    "version": "01", 
 
    "quantity": 200 
 
    }, { 
 
    "version": "02", 
 
    "quantity": 4300 
 
    }, ] 
 
}]; 
 

 
jsonOptions.forEach(function(item) { 
 

 
    var option = '<option value="' + item.product + '">' + item.description + '</option>'; 
 

 
    dataList.append(option); 
 
}); 
 

 
$(function() { 
 
    $('body').on('input', '.product,.products', function() { 
 

 
    var i = this.value; 
 
    var description = ""; 
 
    var productsInBox = 0; 
 
    var text = ""; 
 

 
    jsonOptions.forEach(function(a) { 
 
     if (a.product == i) { 
 
     description = a.description; 
 
     productsInBox = a.productsInBox; 
 
     for (let i = 0, l = a.labels.length; i < l; i++) { 
 
      text += "version " + a.labels[i].version + " has " + a.labels[i].quantity + "\n" 
 
     } 
 

 
     } 
 
    }); 
 
    $(this).closest('.form-group').find('.description').val(description); 
 
    $(this).closest('.form-group').find('.mytext').val(text); 
 
    console.log(text); 
 

 
    }); 
 
}); 
 

 
$('[data-toggle="popover"]').popover();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" /> 
 
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css" rel="stylesheet" /> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script> 
 

 

 
<form id="form1" method="post" class="form-horizontal" role="form"> 
 
    <fieldset> 
 
    <div class="form-group"> 
 
     <div class="col-sm-2"> 
 
     <input type="text" list="products" class="form-control product" name="product[]" /> 
 
     <datalist id="products" class="products"></datalist> 
 
     </div> 
 

 
     <div class="col-sm-3"> 
 
     <input id="" type="text" class="form-control description" name=" description[]" /> 
 
     </div> 
 
     
 
     
 
     <div class="col-sm-3" style="margin-left: 10px;"> 
 
     <button type="button" class="btn btn-info btn-group-sm mytext" data-toggle="popover" data-content="text to change to like: version 01 has 500 "><i class="fa fa-info"></i></button> 
 
     </div> 
 

 
    </div> 
 
    </fieldset> 
 
</form>

Répondre

1

Vous pouvez utiliser une autre boucle forEach itérer sur la labels et obtenir le versions et quantities pour la sélection en cours, ajoutez-les à une variable vide prédéfinie, puis ajoutez-les à la popover en utilisant la méthode attr():

var dataList = $('.products'); 
 
var jsonOptions = [{ 
 
    "product": "11111", 
 
    "description": "description 1", 
 
    "labels": [{ 
 
    "version": "01", 
 
    "quantity": 500 
 
    }, { 
 
    "version": "02", 
 
    "quantity": 800 
 
    }, ] 
 
}, { 
 
    "product": "22222", 
 
    "description": "description 2", 
 
    "labels": [{ 
 
    "version": "01", 
 
    "quantity": 900 
 
    }, { 
 
    "version": "02", 
 
    "quantity": 100 
 
    }, ] 
 
}, { 
 
    "product": "33333", 
 
    "description": "description 3", 
 
    "labels": [{ 
 
    "version": "01", 
 
    "quantity": 200 
 
    }, { 
 
    "version": "02", 
 
    "quantity": 4300 
 
    }, ] 
 
}]; 
 

 
jsonOptions.forEach(function(item) { 
 

 
    var option = '<option value="' + item.product + '">' + item.description + '</option>'; 
 

 
    dataList.append(option); 
 
}); 
 

 
$(function() { 
 
    $('body').on('input', '.product,.products', function() { 
 

 
    var i = this.value; 
 
    var description = ""; 
 
    var productsInBox = 0; 
 
    var text = ""; 
 
    var version = ''; 
 
    var quantity = ''; 
 
    jsonOptions.forEach(function(a) { 
 
     if (a.product == i) { 
 
     description = a.description; 
 
     productsInBox = a.productsInBox; 
 
     text = a.labels 
 
     a.labels.forEach(function(el) { 
 
      version += el.version + " "; 
 
      quantity += el.quantity + " "; 
 
     }); 
 
     } 
 
    }); 
 
    
 
    $('[data-toggle="popover"]').attr('data-content', "versions are: " + version + ' and quantity are: ' + quantity).data('bs.popover').setContent(); 
 
    $(this).closest('.form-group').find('.description').val(description); 
 
    $(this).closest('.form-group').find('.mytext').val(description); 
 

 

 
    }); 
 
}); 
 

 
$('[data-toggle="popover"]').popover();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" /> 
 
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css" rel="stylesheet" /> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script> 
 

 

 
<form id="form1" method="post" class="form-horizontal" role="form"> 
 
    <fieldset> 
 
    <div class="form-group"> 
 
     <div class="col-sm-2"> 
 
     <input type="text" list="products" class="form-control product" name="product[]" /> 
 
     <datalist id="products" class="products"></datalist> 
 
     </div> 
 

 
     <div class="col-sm-3"> 
 
     <input id="" type="text" class="form-control description" name=" description[]" /> 
 
     </div> 
 

 
     <div class="col-sm-3" style="margin-left: 10px;"> 
 
     <button type="button" class="btn btn-info btn-group-sm mytext" data-toggle="popover" data-content="text to change to like: version 01 has 500 "><i class="fa fa-info"></i></button> 
 
     </div> 
 

 
    </div> 
 
    </fieldset> 
 
</form>

+1

J'étais assez proche! :) Merci beaucoup! – yaylitzis

+0

@yaylitzis, oui vous étiez. Vous êtes les bienvenus. Heureux d'aider. – Ionut

+1

@yaylitzis, j'ai aussi regardé dans la documentation 'popover()' et j'ai mis à jour ma réponse pour avoir un changement en direct sur la popup quand elle est ouverte aussi. Ajout de l'extension '.data ('bs.popover'). SetContent();' à $ ('[data-toggle = "popover"]'). Attr ('contenu-données', "versions sont:" + version + 'et la quantité sont:' + quantité) .data ('bs.popover'). setContent(); '. Maintenant, quand le popup est ouvert et que vous changez les valeurs pour les entrées, vous pouvez voir le changement dans le popup. – Ionut

0

Si je comprends bien, vous aurez besoin de mettre à jour l'attribut de données de contenu basé sur la valeur sélectionnée.

<div class="col-sm-3" style="margin-left: 10px;"> 
    <button type="button" class="btn btn-info btn-group-sm mytext" data-toggle="popover" data-content="text to change to like: version 01 has 500 "> 
    <i class="fa fa-info"></i></button> 
</div> 

Mise à jour de votre extrait. probablement vous aurez besoin de gérer: comment fermer popover lorsque la sélection change

var dataList = $('.products'); 
 
var jsonOptions = [{ 
 
    "product": "11111", 
 
    "description": "description 1", 
 
    "labels": [{ 
 
    "version": "01", 
 
    "quantity": 500 
 
    }, { 
 
    "version": "02", 
 
    "quantity": 800 
 
    }, ] 
 
}, { 
 
    "product": "22222", 
 
    "description": "description 2", 
 
    "labels": [{ 
 
    "version": "01", 
 
    "quantity": 900 
 
    }, { 
 
    "version": "02", 
 
    "quantity": 100 
 
    }, ] 
 
}, { 
 
    "product": "33333", 
 
    "description": "description 3", 
 
    "labels": [{ 
 
    "version": "01", 
 
    "quantity": 200 
 
    }, { 
 
    "version": "02", 
 
    "quantity": 4300 
 
    }, ] 
 
}]; 
 

 
jsonOptions.forEach(function(item) { 
 

 
    var option = '<option data- value="' + item.product + '">' + item.description + '</option>'; 
 

 
    dataList.append(option); 
 
    
 
}); 
 

 
$(function() { 
 
    $("#clear").click(function (e) { 
 
    $(".product, .description").val(""); 
 
    $('.mytext').popover('hide'); 
 
    }); 
 

 
    $('body').on('input', '.product', function() { 
 

 
    var i = this.value; 
 
    
 
    var description = ""; 
 
    var productsInBox = 0; 
 
    var labelData = ""; 
 

 
    jsonOptions.forEach(function(a) { 
 
     if (a.product == i) { 
 
     description = a.description; 
 
     productsInBox = a.productsInBox; 
 
     labelData = 
 
      'product ' + a.product + ' | ' + 
 
      'version: ' + a.labels[0].version + 
 
      ' | quantity: ' + a.labels[0].quantity + " | " + 
 
      'version: ' + a.labels[1].version + 
 
      ' | quantity: ' + a.labels[1].quantity + "\r\n"; 
 
     } 
 
    }); 
 
    
 
    $(this).closest('.form-group').find('.description').val(description); 
 

 
    $(this).closest('.form-group').find('.mytext').attr("data-content", labelData); 
 
    $('.mytext').popover('toggle').popover('show'); 
 

 
    }); 
 
}); 
 

 
// $('.mytext').popover();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" /> 
 
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css" rel="stylesheet" /> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script> 
 

 

 
<form id="form1" method="post" class="form" role="form"> 
 
    <fieldset> 
 
    <div class="form-group"> 
 
     <a class="btn btn-danger" id="clear">clear</a> 
 
    
 
     <div class="col-sm-2"> 
 
     <input type="text" list="products" class="form-control product" name="product[]" /> 
 
     <datalist id="products" class="products"></datalist> 
 
     </div> 
 

 
     <div class="col-sm-3"> 
 
     <input id="" type="text" class="form-control description" name=" description[]" /> 
 
     </div> 
 

 
     <div class="col-sm-3"> 
 
     <button type="button" class="btn btn-info btn-group-sm mytext" data-toggle="popover" data-content="text to change to like: version 01 has 500 "><i class="fa fa-info"></i></button> 
 
     
 
     
 
     </div> 
 

 
     
 

 
    </div> 
 
    </fieldset> 
 
</form>