2017-07-06 1 views
0

Ich versuche, die Werte in einem Array zu aktualisieren, nachdem ein Element aus einer Auswahlliste entfernt wurde. Dazu benötige ich die attr('name') für die Liste. Auf dem Ereignis eines item_remove kann die $item die Auswahlliste erhalten, aber sie kann die attr('name') nicht finden, die ich benötige.Ist es möglich, den Namen einer Auswahlliste von einem Element zu erhalten, das gerade aus dieser Liste entfernt wurde?

Die folgende Lösung ist, wie ich dies für eine item_add Ereignis mache. Sie werden sehen, dass die var thisSelect die Auswahlliste erhält und von daher kann ich das Array Werte mit den tatsächlichen Listenwerten auffüllen.

/** 
* Add callback behaviour once a select element has been selected. 
*/ 
    $('[data-type="select"]').each(function(i, v) { 
     v.selectize.on('item_add', function (value, $item) { 
      var thisSelect = $item.parents('.controls').find('select'), 
       name = thisSelect.attr('name'), 
       values = [], 
       exclusiveSelected = thisSelect.find('option[data-exclusive="true"]:selected'); 

      if (exclusiveSelected.length) { 
       values.push({ 
        "value": exclusiveSelected.val(), 
        "label": exclusiveSelected.text().trim(), 
        "label-key": exclusiveSelected.attr("label-key") 
       }); 

       thisSelect.val(exclusiveSelected.val()).trigger('change'); 

      } else { 
       thisSelect.siblings('.selectize-control').find('.item').each(function(i, v) { 
        values.push({ 
         "value": $(v).data('value'), 
         "label": $(v).text().trim(), 
         "label-key": $(v).attr("label-key") 
        }); 
       }); 
      } 

      setMultipleFieldValues(name, values); 
      validate(documentId, name, fields); 
     }); 
    }); 

Unten ist meine aktuelle Lösung für ein item_remove Ereignis. Ein Cannot set property 'values' of undefined Fehler tritt in der Konsole auf, da das Wertearray aufgrund des Namens der Liste, die als nicht definiert zurückgegeben wird, nicht ausgefüllt werden kann.

/** 
* Add callback behaviour once a select element has been unselected. 
*/ 
    $('[data-type="select"]').each(function(i, v) { 
     v.selectize.on('item_remove', function (value, $item) { 
      var thisSelect = $item.parents('.controls').find('select'), 
       name = thisSelect.attr('name'), 
       values = []; 

      thisSelect.siblings('.selectize-control').find('.item').each(function(i, v) { 
       values.push({ 
        "value": $(v).data('value'), 
        "label": $(v).text().trim(), 
        "label-key": $(v).attr("label-key") 
       }); 
      }); 

      setMultipleFieldValues(name, values); 
      validate(documentId, name, fields); 
     }); 
    }); 

Beigefügt ist das select-Element ich den Namen „additionalWork“ von

html

Antwort

0

Dank onDelete Rückruf Parsen, die Lösung, die ich es geschafft, kommen mit Beteiligten, den $ input bekommen anstatt die $ item. Dazu könnte ich die Werte in der Liste abrufen.

/** 
* Add callback behaviour once a select element has been unselected. 
*/ 
    $('[data-type="select"]').each(function(i, v) { 
     v.selectize.on('item_remove', function (value, $item) { 
      var thisSelect = this.$input, 
       name = thisSelect.attr('name'), 
       values = [], 
       exclusiveSelected = thisSelect.find('option[data-exclusive="true"]:selected'); 

      if (exclusiveSelected.length) { 
       values.push({ 
        "value": exclusiveSelected.val(), 
        "label": exclusiveSelected.text().trim(), 
        "label-key": exclusiveSelected.attr("label-key") 
       }); 

       thisSelect.val(exclusiveSelected.val()).trigger('change'); 

      } else { 
       thisSelect.siblings('.selectize-control').find('.item').each(function(i, v) { 
        values.push({ 
         "value": $(v).data('value'), 
         "label": $(v).text().trim(), 
         "label-key": $(v).attr("label-key") 
        }); 
       }); 
      } 

      setMultipleFieldValues(name, values); 
      validate(documentId, name, fields); 
     }); 
    }); 
2

Sie müssen bekommen versuchen, um das Objekt zu erhalten, wie es gelöscht wird. Ich würde vorschlagen, eine Funktion in das für Ihre Antworten

Demo http://jsfiddle.net/uZmcD/91/

$(function() { 
    $('#select-name').selectize({ 
    plugins: ['remove_button'], 
    onDelete: function(values) { 
     item_remove_function($(this)); 
    } 
    }); 
}); 

function item_remove_function($this) { 

    var name = $this[0].$wrapper.siblings('select').attr('name'); 
    alert('select name = ' + name); 

} 
Verwandte Themen