Skip to main content

newItem() Refactor

So, the _newMeal() and newWorkout() methods in the last lesson were very similar. We are going to combine them into a single method called _newItem().

First we need to change the event handlers. We are going to change the method name to _newItem() and pass in the type of item as a parameter.

document
.getElementById('meal-form')
.addEventListener('submit', this._newItem.bind(this, 'meal'));

document
.getElementById('workout-form')
.addEventListener('submit', this._newItem.bind(this, 'workout'));

Now, let's create the method, which will take in a type parameter.

  _newItem(type, e) {
e.preventDefault();
const name = document.getElementById(`${type}-name`);
const calories = document.getElementById(`${type}-calories`);

if (name.value === '' || calories.value === '') {
alert('Please fill in all fields');
return;
}

if (type === 'meal') {
const meal = new Meal(name.value, +calories.value);
this._tracker.addMeal(meal);
}
if (type === 'workout') {
const workout = new Workout(name.value, +calories.value);
this._tracker.addWorkout(workout);
}

name.value = '';
calories.value = '';

const collapseItem = document.getElementById(`collapse-${type}`);
const bsCollapse = new bootstrap.Collapse(collapseItem, {
toggle: true,
});
}

As you can see, we just changed a lot of the hardcoded 'meal' and 'workout' strings to the type parameter. We also added a conditional to see which tracker method would be called.