JQuery Selector con prefijos
-
29-10-2019 - |
Pregunta
Este es mi código HTML:
<div id="editorRows">
<div class="editorRow">
<input type="hidden" value="01c4ed6d-1234-4951-b048-d86208636479" autocomplete="off" name="comds.index">
Grupa:
<select id="comds_01c4ed6d-1234-4951-b048-d86208636479__Grupa" name="comds[01c4ed6d-1234-4951-b048-d86208636479].Grupa">
Produsul:
<select id="comds_01c4ed6d-1234-4951-b048-d86208636479__Produs" name="comds[01c4ed6d-1234-4951-b048-d86208636479].Produs">
Cantitate:
<input id="comds_01c4ed6d-1234-4951-b048-d86208636479__Cantitate" type="text" value="0" name="comds[01c4ed6d-1234-4951-b048-d86208636479].Cantitate" data-val-required="The Cantitate field is required." data-val-number="The field Cantitate must be a number." data-val="true">
Pret:
<input id="comds_01c4ed6d-1234-4951-b048-d86208636479__Pret" type="text" value="17.23" size="4" name="comds[01c4ed6d-1234-4951-b048-d86208636479].Pret" data-val-required="The Pret field is required." data-val-number="The field Pret must be a number." data-val="true">
TVA:
<input id="comds_01c4ed6d-1234-4951-b048-d86208636479__TVA" type="text" value="0.24" name="comds[01c4ed6d-1234-4951-b048-d86208636479].TVA" data-val-required="The TVA field is required." data-val-number="The field TVA must be a number." data-val="true">
Total:
<input id="comds_01c4ed6d-1234-4951-b048-d86208636479__Total" type="text" value="0" name="comds[01c4ed6d-1234-4951-b048-d86208636479].Total" data-val-required="The Total field is required." data-val-number="The field Total must be a number." data-val="true">
<a class="deleteRow" href="#">Sterge</a>
</div>
<div class="editorRow">
<input type="hidden" value="97b4ac65-73f8-4339-a707-bad53763fb2e" autocomplete="off" name="comds.index">
Grupa:
<select id="comds_97b4ac65-73f8-4339-a707-bad53763fb2e__Grupa" name="comds[97b4ac65-73f8-4339-a707-bad53763fb2e].Grupa">
Produsul:
<select id="comds_97b4ac65-73f8-4339-a707-bad53763fb2e__Produs" name="comds[97b4ac65-73f8-4339-a707-bad53763fb2e].Produs">
Cantitate:
<input id="comds_97b4ac65-73f8-4339-a707-bad53763fb2e__Cantitate" type="text" value="0" name="comds[97b4ac65-73f8-4339-a707-bad53763fb2e].Cantitate">
Pret:
<input id="comds_97b4ac65-73f8-4339-a707-bad53763fb2e__Pret" type="text" value="17.23" size="4" name="comds[97b4ac65-73f8-4339-a707-bad53763fb2e].Pret">
TVA:
<input id="comds_97b4ac65-73f8-4339-a707-bad53763fb2e__TVA" type="text" value="0.24" name="comds[97b4ac65-73f8-4339-a707-bad53763fb2e].TVA">
Total:
<input id="comds_97b4ac65-73f8-4339-a707-bad53763fb2e__Total" type="text" value="0" name="comds[97b4ac65-73f8-4339-a707-bad53763fb2e].Total">
<a class="deleteRow" href="#">Sterge</a>
</div>
<div class="editorRow">.....
</div>
Entonces, estoy ofreciendo una vista parcial para mostrar más elementos y tengo una acción para crear más. Estoy tratando de llamar a una función JSON cuando cambio el valor en la primera lista desplegable para repoblar la segunda. Este es mi guión: ACTUALIZAR
<script type="text/javascript">
$(document).ready(function () {
$('name$=.Grupa').change(function () {
var url = '<%= Url.Content("~/") %>' + "Comenzi/ForProduse";
var ddlsource = $(this);
var ddltarget = $(this).siblings('[name$=.Produs]:first');
$.getJSON(url, { id: $(ddlsource).val() }, function (data) {
$(ddltarget).empty();
$.each(data, function (index, optionData) {
$(ddltarget).append("<option value='" + optionData.Value + "'>" + optionData.Text + "</option>");
});
});
});
});
</script>
No se llama a mi acción JSON del controlador. ¿Qué debo cambiar en el script para trabajar? ¡Gracias!
Solución
No estoy seguro de que este sea el único problema, pero creo que los selectores que está construyendo no son lo que quiere hacer.
.editRow.Grupa
coincidirá con un elemento con la clase Editrow y la clase .Grupa
Creo que esta línea:
var ddlsource = '.editRow.Grupa';
probablemente debería ser solo ser $(this)
;
y tu var ddlsource = '.editRow.Grupa';
Debería ser algo como var target = $(this).siblings('[name$=.Produs]:first');
Y luego cualquiera de estos: $(ddltarget)
debe ser objetivo en su lugar.
tan bien como esto:
$(document).ready(function () {
$('[name$=.Grupa]').change(function () { //targets things with the name ending in .Grupa
var url = '<%= Url.Content("~/") %>' + "Comenzi/ForProduse";
var source =$(this); //this will be which ever one is changed
var target = $(this).siblings('[name$=.Produs]:first'); //this SHOULD find the first select with a name ending in .Produs that is the sibling (same level in the dom to the changed select)
$.getJSON(url, { id: source.val() }, function (data) {
target.empty();
$.each(data, function (index, optionData) {
target.append("<option value='" + optionData.Value + "'>" + optionData.Text + "</option>");
});
});
});
});
No he probado esto, pero esa es la idea general de lo que debe buscar. Nota, los selectores que estoy usando son bastante ineficientes, si puede cambiar el código generado para que sus cuadros de selección tengan una clase conocida, sería mucho más ordenado y más efectivo
Otros consejos
A menos que solo me lo esté perdiendo $('.editRow.Grupa')
No parece coincidir con nada en tu HTML. Esto dice encontrar todos los elementos con una clase de editRow
y Grupa
. No tienes elementos con una clase de Grupa
.
Consulte esta lista de selectores para obtener formas válidas de seleccionar elementos:
http://api.jquery.com/category/selectors/
Su selector está cerca si lo cambia a $('.editRow .Grupa')
y agregue una clase a su grupa seleccione que sea Grupa
.
Lo que esto dice es que obtenga todos los elementos que están dentro de un elemento con la clase de editRow
y tener la clase de Grupa
. Tu selector dice que quieres todos los elementos que tienen la clase editRow
y Grupa
.