2014-10-02 6 views
1

У меня есть оператор case switch в некотором javascript, который затем должен запускать ту же самую функцию .each, только с изменением параметра.Как я могу абстрагироваться от этой функции .each?

$('#item_type').change(function() { 
     switch(this.value) { 
      case 'CH': 
       $('#item_code').empty(); 
       $.each(cheeses, function(key, value) { 
        $('#item_code') 
        .append($("<option></option>") 
        .attr("value",key) 
        .text(value)); 
       }); 
       break; 

      case 'Z': 
       $('#item_code').empty(); 
       $.each(sizes, function(key, value) { 
        $('#item_code') 
        .append($("<option></option>") 
        .attr("value",key) 
        .text(value)); 
       }); 
       break; 
     } 

    }); 

Как я могу изменить положение вещей, так что функция .each только определенные один раз, и может просто называться в различных случаях, что-то вроде этого:

case 'CH': 
    $('#item_code').empty(); 
    doEach(cheeses); 
    break; 
case 'Z': 
    $('#item_code').empty(); 
    doEach(sizes); 
    break; 
+2

'функция doEach (сборник) {$ .each (сбор, ...); } '. – dfsq

+0

Спасибо, что сделал то, что мне нужно. Если вы опубликуете ответ, я соглашусь. – EmmyS

ответ

1

Довольно простой подход был бы:

function doEach(collection) { 
    $.each(collection, function(key, value) { 
     $('#item_code') 
      .append($("<option></option>") 
      .attr("value",key) 
      .text(value)); 
    }); 
} 

или вы могли бы пойти с очень простой плагин:

$.fn.populate = function (collection) { 
    return this.each(function() { 
     var $self = $(this).empty(); 
     $.each(collection, function (key, value) { 
      $('<option>').attr('value', key).text(value).appendTo($self); 
     }); 
    }); 
}; 

$('#item_type').change(function() { 
    switch (this.value) { 
     case 'CH': 
      $('#item_code').populate(cheeses); 
      break; 

     case 'Z': 
      $('#item_code').populate(sizes); 
      break; 
    } 
}); 
3

Вы можете хранить каждую функцию в переменную, а затем передать ее в .each следующим образом:

var addOptions = function(key, value) { 
       $('#item_code') 
       .append($("<option></option>") 
       .attr("value",key) 
       .text(value)); 
      }; 

$('#item_type').change(function() { 
    switch(this.value) { 
     case 'CH': 
      $('#item_code').empty(); 
      $.each(cheeses, addOptions); 
      break; 

     case 'Z': 
      $('#item_code').empty(); 
      $.each(sizes, addOptions); 
      break; 
    } 

}); 

Удачи!