尝试使用变量r测试我的代码时。我用window.r定义的,它给了我一个未定义的错误变量。
当我在命令行中输入r.parseIngredients()
时,会发生以下错误:
VM3439:1未捕获的ReferenceError:未定义r 在:1:1
import Search from './models/Search';
import Recipe from './models/Recipe';
import * as searchView from './views/searchView';
import { elements, renderLoader, clearLoader } from './views/base';
// const search = new Search('pizza');
// console.log(search);
// search.getResults();
/** GLobal state of the app
* - Search object
* - Current Recipe Object
* - Shopping list object
* - Liked recipes
*/
const state = {};
/*
-- Search Controller
*/
const controlSearch = async () => {
// 1) Get query from view
// const query = searchView.getInput();
const query = 'pizza';
if (query) {
// 2) New seach object and add to state
state.search = new Search(query);
// 3) Prepare UI for results
searchView.clearInput();
searchView.clearResults();
renderLoader(elements.searchRes);
try {
// 4) Search for recipes
await state.search.getResults();
// 5) Render results on UI
clearLoader();
searchView.renderResults(state.search.results);
} catch (err) {
alert('Something wrong with the search...');
clearLoader();
}
}
}
elements.searchForm.addEventListener('submit', e => {
e.preventDefault();
controlSearch();
});
// Testing
window.addEventListener('load', e => {
e.preventDefault();
controlSearch();
});
elements.searchResPages.addEventListener('click', e => {
const btn = e.target.closest('.btn-inline');
if (btn) {
const goToPage = parseInt(btn.dataset.goto, 10);
searchView.clearResults();
searchView.renderResults(state.search.results, goToPage);
}
});
/*
Recipe Controller
*/
const controlRecipe = async () => {
// Get ID from url
const id = window.location.hash.replace('#', '');
console.log(id);
if (id) {
// Prepare UI for changes
// Create new recipe object
state.recipe = new Recipe(id);
// Testing
window.r = state.recipe;
try {
// get recipe data
await state.recipe.getRecipe();
// Calculate servings and time
state.recipe.calcTime();
state.recipe.calcServings();
// Render recipe
console.log(state.recipe);
} catch (err) {
alert('Error processing recipe!');
}
}
};
// window.addEventListener('hashchange', controlRecipe);
// window.addEventListener('load', controlRecipe);
['hashchange', 'load'].forEach(event => window.addEventListener(event, controlRecipe));
import axios from 'axios';
import { key, proxy } from '../config.js'
export default class Recipe {
constructor(id) {
this.id = id;
}
async getRecipe() {
try {
const res = await axios(`${proxy}http://food2fork.com/api/get?key=${key}&rId=${this.id}`);
this.title = res.data.recipe.title;
this.author = res.data.recipe.publisher;
this.img = res.data.recipe.image_url;
this.url = res.data.recipe.source_url;
this.ingredients = res.data.recipe.ingredients;
console.log(res);
} catch (error) {
console.log(error);
alert('Something went wrong')
}
}
calcTime() {
// Assuming that we need 15 min for each 3 ingredients
const numIng = this.ingredients. length;
const periods = Math.ceil(numIng / 3);
this.time = periods * 15;
}
calcServings() {
this.servings = 4;
}
parseIngredients() {
const unitsLong = ['tablespoons', 'tablespoon', 'ounces', 'ounce', 'teaspoons', 'teaspoon', 'cups', 'pounds'];
const unitsShort = ['tbsp', 'tbsp', 'oz', 'oz', 'tsp', 'tsp', 'cup', 'pound'];
const newIngredients = this.ingredients.map(el => {
// 1) Uniform units
let ingredient = el.toLowerCase();
unitsLong.forEach((unit, i) => {
ingredient = ingredient.replace(unit, unitsShort[i]);
});
// 2) Remove parentheses
ingredient = ingredient.replace(/ *\([^)]*\) */g, ' ')
// 3) Parse ingredients into count, unit and ingredient
const arrIng = ingredient.split(' ');
const unitIndex = arrIng.findIndex(el2 => unitsLong.includes(el2));
let objIng;
if (unitIndex > -1) {
// There is a unit
// Ex. 4 1/2 cups, arrCount is [4, 1/2]
// 4 cups, arrCount is [4]
const arrCount = arrIng.slice(0, unitIndex);
let count;
if (arrCount.length === 1) {
count = arrIng[0];
} else {
count = eval(arrIng.slice(0, unitIndex).join('+'));
}
} else if (parseInt(arrIng[0], 10)) {
// There is no unit, but the first element is a number
objIng = {
count: parseInt(arrIng[0], 10),
unit: '',
ingredient: arrIng.slice(1).join(' ')
}
} else if (unitIndex === -1) {
// There is no unit and No number in the 1st position
objIng = {
count: 1,
unit: '',
ingredient
}
}
return objIng;
});
this.ingredients = newIngredients;
}
}
r.parseIngredients()
应该显示缩写的成分单位。 例如:4汤匙应该是4汤匙。