我正在尝试使用以下Bootstrap代码段:http://bootsnipp.com/snippets/featured/dynamic-form-fields-add-new-field-on-focus-or-change
我在同一页面的2个不同模式对话框中使用它。
我按照上面链接中的建议实现了它:
HTML:
<div class="container">
<h3>Selects</h3>
<div class="row">
<div class="form-group form-group-multiple-selects col-xs-11 col-sm-8 col-md-4">
<div class="input-group input-group-multiple-select col-xs-12">
<select class="form-control" name="values[]">
<option value="">Select one</option>
<option value="1">Option 1</option>
<option value="2">Option 2</option>
<option value="3">Option 3</option>
<option value="4">Option 4</option>
</select>
<span class="input-group-addon input-group-addon-remove">
<span class="glyphicon glyphicon-remove"></span>
</span>
</div>
</div>
</div>
</div>
Javascript:
/*
Text fields
*/
$(function(){
$(document).on('focus', 'div.form-group-options div.input-group-option:last-child input', function(){
var sInputGroupHtml = $(this).parent().html();
var sInputGroupClasses = $(this).parent().attr('class');
$(this).parent().parent().append('<div class="'+sInputGroupClasses+'">'+sInputGroupHtml+'</div>');
});
$(document).on('click', 'div.form-group-options .input-group-addon-remove', function(){
$(this).parent().remove();
});
});
/*
Selects
*/
$(function(){
var values = new Array();
$(document).on('change', '.form-group-multiple-selects .input-group-multiple-select:last-child select', function(){
var selectsLength = $('.form-group-multiple-selects .input-group-multiple-select select').length;
var optionsLength = ($(this).find('option').length)-1;
if(selectsLength < optionsLength){
var sInputGroupHtml = $(this).parent().html();
var sInputGroupClasses = $(this).parent().attr('class');
$(this).parent().parent().append('<div class="'+sInputGroupClasses+'">'+sInputGroupHtml+'</div>');
}
updateValues();
});
$(document).on('change', '.form-group-multiple-selects .input-group-multiple-select:not(:last-child) select', function(){
updateValues();
});
$(document).on('click', '.input-group-addon-remove', function(){
$(this).parent().remove();
updateValues();
});
function updateValues()
{
values = new Array();
$('.form-group-multiple-selects .input-group-multiple-select select').each(function(){
var value = $(this).val();
if(value != 0 && value != ""){
values.push(value);
}
});
$('.form-group-multiple-selects .input-group-multiple-select select').find('option').each(function(){
var optionValue = $(this).val();
var selectValue = $(this).parent().val();
if(in_array(optionValue,values)!= -1 && selectValue != optionValue)
{
$(this).attr('disabled', 'disabled');
}
else
{
$(this).removeAttr('disabled');
}
});
}
function in_array(needle, haystack){
var found = 0;
for (var i=0, length=haystack.length;i<length;i++) {
if (haystack[i] == needle) return i;
found++;
}
return -1;
}
});
仅在页面上使用一次时,它可以完全按预期工作。但是在同一页面上使用2次时,它们会冲突并且无法正常工作。我尝试将所有ID更改为idname2(末尾带有2),并做了整个JavaScript的副本,也将所有ID名称也都替换为2。虽然这行得通,但也似乎是实现此问题的非常糟糕的方式。
您能帮我弄清楚如何实现它,以便可以在同一页面上使用至少两次的代码吗?任何帮助将不胜感激。
我知道这不会调整您提供的JavaScript,但这应该为您提供一个可以构建的更好结构的基础。.这是使用Knockout v3以及您提供的bootstrap css和markup的基本建议示例。
在这里提琴: http : //jsfiddle.net/n6ngC/55/
更新的小提琴:http : //jsfiddle.net/n6ngC/85
淘汰赛是轻量级的,可以从http://knockoutjs.com/downloads/index.html下载(如果您使用的是NuGet,请从那里获取)
这需要做更多的工作,因为由于下拉菜单的更改,最初总是会添加一个项目。.我建议改为使用按钮进行新选择,但这显然取决于要求。
当前,它无法跟踪所做选择后所做的更改,但是将可观察数组更改为包含可观察项将解决此问题。
参见下文:HTML
<div class="container">
<h3>Meals</h3>
<div class="row" data-bind="foreach: meals">
<div class="form-group form-group-multiple-selects col-xs-11 col-sm-8 col-md-4">
<div class="input-group input-group-multiple-select col-xs-12">
<select class="form-control" data-bind="options: $root.availableMeals, value: $data, optionsValue: 'id', optionsText: 'text'">
</select>
<span class="input-group-addon input-group-addon-remove" data-bind="click: $root.removeMealOption">
<span class="glyphicon glyphicon-remove"></span>
</span>
</div>
</div>
</div>
<div class="row">
<div class="form-group form-group-multiple-selects col-xs-11 col-sm-8 col-md-4">
<div class="input-group input-group-multiple-select col-xs-12">
<select class="form-control" data-bind="options: availableMeals, value: newMeal, optionsValue: 'id', optionsText: 'text'">
</select>
</div>
</div>
</div>
</div>
<div class="container">
<h3>People</h3>
<div class="row" data-bind="foreach: people">
<div class="form-group form-group-multiple-selects col-xs-11 col-sm-8 col-md-4">
<div class="input-group input-group-multiple-select col-xs-12">
<select class="form-control" data-bind="options: $root.availablePeople, value: $data, optionsValue: 'id', optionsText: 'text'">
</select>
<span class="input-group-addon input-group-addon-remove" data-bind="click: $root.removePersonOption">
<span class="glyphicon glyphicon-remove"></span>
</span>
</div>
</div>
</div>
<div class="row">
<div class="form-group form-group-multiple-selects col-xs-11 col-sm-8 col-md-4">
<div class="input-group input-group-multiple-select col-xs-12">
<select class="form-control" data-bind="options: availablePeople, value: newPerson, optionsValue: 'id', optionsText: 'text'">
</select>
</div>
</div>
</div>
</div>
Javascript:
function MyViewModel() {
var self = this;
self.newMeal = ko.observable();
self.newPerson = ko.observable();
// the available list of options for each dropdown
self.availableMeals = [
{ id:"ST", text: "Standard (sandwich)" },
{ id: "PR", text: "Premium (lobster)" },
{ id: "UL", text: "Ultimate (whole zebra)" }
];
self.availablePeople = [
{ id:"ST", text: "Steve" },
{ id: "BT", text: "Bert" },
{ id: "ER", text: "Ernie" }
];
// the selected values
// this will be a list of objects that have their own observable properties
self.meals = ko.observableArray([]);
self.people = ko.observableArray([]);
// separate add and remove options
self.addMealOption = function(meal) { self.meals.push(meal); }
self.removeMealOption = function(meal) { self.meals.remove(meal); }
self.addPersonOption = function(person) { self.people.push(person); }
self.removePersonOption = function(person) { self.people.remove(person); }
self.newMeal.subscribe(function(value) {
self.addMealOption(value);
});
self.newPerson.subscribe(function(value) {
self.addPersonOption(value);
});
}
// Activates knockout.js
ko.applyBindings(new MyViewModel());
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句