Исключить дублирование кода при передаче параметров лямбда-цикла - PullRequest
0 голосов
/ 20 декабря 2011

Задача

Массив определяет эти элементы:

var equipment = new Array( "bakeware", "cookware", "kitchenware", "utensils" );

Существует функция, которая связывает эти типы оборудования с редактируемыми полями:

function register_equipment( equipment ) {
  $('#recipe-equipment-' + equipment).append(
    '<span class="edit-recipe-equipment"></span><br />' );

  $('.edit-recipe-equipment').editable( 'php/save.php', {
    onblur   : 'submit',
    style    : 'display: inline',
    maxlength: 15,
    size     : 10
  });

  return true;
}

Это позволяет пользователям нажимать на поле и редактировать его значение. Поле ввода исчезает, когда пользователь заканчивает редактирование.

Следующий код дублируется четыре раза (один раз для каждого предмета снаряжения):

  $('#equipment-new-bakeware').click( function() {
    return register_equipment( 'bakeware' );
  });

Это работает, но не идеально.

Вопрос

Как бы вы написали код, чтобы не было дублирования?

Следующее не работает, но показывает намерение удалить дублирование:

for( var i = 0; i < equipment.length; i++ ) {
  $('#equipment-new-' + equipment[i]).click( function() {
    return register_equipment( equipment[i] );
  });
}

Спасибо!

Ответы [ 3 ]

1 голос
/ 20 декабря 2011

Быстрый ответ - создать еще одну область видимости, чтобы зафиксировать правильное значение. Немного затянуто, но это идея.

function createOnClick (i) {
  // i will be captured in this function and used below
  return function () {
    register_equipment( equipment[i] );
  };
}

for( var i = 0; i < equipment.length; i++ ) {
  $('#equipment-new-' + equipment[i]).click(createOnClick(i));
}
1 голос
/ 20 декабря 2011

Получить тип оборудования из идентификатора объекта, по которому щелкнули, и использовать это:

var registerEquipment = function() {
    var equipmentType = $(this).attr('id').replace('equipment-new-', '');
    return register_equipment(equipmentType);
  };

for( var i = 0; i < equipment.length; i++ ) { 
  $('#equipment-new-' + equipment[i]).click(registerEquipment);
}
0 голосов
/ 20 декабря 2011
for( item in equipment ) { 
  $('#equipment-new-' + item).click = function () {
    register_equipment(item);
  }
}

Попробуй;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...