当前位置: 首页 > news >正文

上传一个新菜谱-第一部分

上传一个新菜谱-第一部分

首先我们创建一个关于增加菜谱视图的JS文件,写一些和分页差不多的示例代码

import View from './View.js';
import icons from 'url:../../img/icons.svg';class AddRecipeView extends View {_parentElement = document.querySelector('.upload');_generateMarkup() {}
}export default new AddRecipeView();
  • 之后将一些关于上传菜谱的类用变量存储起来,这个看一下HTML代码即可
import View from './View.js';
import icons from 'url:../../img/icons.svg';class AddRecipeView extends View {_parentElement = document.querySelector('.upload');_window = document.querySelector('.add-recipe-window');_overlay = document.querySelector('.overlay');_btnOpen = document.querySelector('.nav__btn--add-recipe');_btnClose = document.querySelector('.btn--close-modal');_generateMarkup() {}
}export default new AddRecipeView();
  • 现在我们需要一个点击事件,用来处理当我们点击的时候将表单窗口的隐藏类给删除掉
  constructor() {super();//继承父类this._addHandlerShowWindow();}_addHandlerShowWindow() {this._btnOpen.addEventListener('click',function () {this._window.classList.remove('hidden');this._overlay.classList.remove('hidden');}.bind(this));}
  • 之后控制器中引入一下,不然我们的代码永远都不会执行

import * as model from './model.js';
import recipeView from './view/recipeView.js';
import searchView from './view/searchView.js';
import resultsView from './view/resultsView.js';
import bookmarksView from './view/bookmarksView.js';
import paginationView from './view/paginationView.js';
import addRecipeView from './view/addRecipeView.js';

在这里插入图片描述

  • 现在还不能关闭这个表单窗口,现在实现关闭表单窗口的方法
 constructor() {super(); //继承父类this._addHandlerShowWindow();this._addHandlerHideWindow();}_addHandlerShowWindow() {this._btnOpen.addEventListener('click',function () {this._window.classList.remove('hidden');this._overlay.classList.remove('hidden');}.bind(this));}_addHandlerHideWindow() {this._btnClose.addEventListener('click',function () {this._window.classList.add('hidden');this._overlay.classList.add('hidden');}.bind(this));}
  • 这里我们将上面的方法改写,以来实现在表单窗口之外点击也可以直接关闭这个窗口,这样用户就不需要必须点击关闭窗口的这个X了
import View from './View.js';
import icons from 'url:../../img/icons.svg';class AddRecipeView extends View {_parentElement = document.querySelector('.upload');_window = document.querySelector('.add-recipe-window');_overlay = document.querySelector('.overlay');_btnOpen = document.querySelector('.nav__btn--add-recipe');_btnClose = document.querySelector('.btn--close-modal');constructor() {super(); //继承父类this._addHandlerShowWindow();this._addHandlerHideWindow();}toggleWindow() {this._overlay.classList.toggle('hidden');this._window.classList.toggle('hidden');}_addHandlerShowWindow() {this._btnOpen.addEventListener('click', this.toggleWindow.bind(this));}_addHandlerHideWindow() {this._btnClose.addEventListener('click', this.toggleWindow.bind(this));this._overlay.addEventListener('click', this.toggleWindow.bind(this));}_generateMarkup() {}
}export default new AddRecipeView();
  • 我们想要获取表单的数据,这里我们使用一个比较新的Web API来获取表单数据
  addHandlerUpload(handler) {this._parentElement.addEventListener('submit', function (e) {e.preventDefault();const data = [...new FormData(this)];console.log(data);handler(data);});}

注:FormData 是一个 Web API,用于构造表单数据格式的键值对,方便通过 JavaScript 发送表单数据,特别是用于 AJAX 请求或 Fetch API。

  • 还是使用发布订阅者模式在控制器中进行渲染视图
//添加新食谱
const controlAddRecipe = function (newRecipe) {console.log(newRecipe);
};
const init = function () {bookmarksView.addHandlerRender(controlBookmarks);recipeView.addHandlerRender(controlRecipes);recipeView.addHandlerUpdateServings(controlServings);recipeView.addHandlerAddBookmark(controlAddBookmark);searchView.addHandlerSearch(controlSearchResults);paginationView.addHandlerClick(controlPagination);addRecipeView.addHandlerUpload(controlAddRecipe);
};init();
  • 现在我们只需要点击上传的按钮就能拿到表单数据

在这里插入图片描述

  • 之后我们讲这些数组转换为普通的对象
  addHandlerUpload(handler) {this._parentElement.addEventListener('submit', function (e) {e.preventDefault();const dataArr = [...new FormData(this)];const data = Object.fromEntries(dataArr);handler(data);});}

在这里插入图片描述

  • 但是这里还缺少一些东西,例如ID之类的东西,这些会在model中进行处理,这个将在第二部分进行处理

相关文章:

  • 深入解析Docker网桥模式:从docker0到容器网络的完整通信链路
  • 人机交互设计知识点总结
  • 控制器轨迹生成
  • 如何设计一个用于大规模生产任务的人工智能AI系统
  • 【轨物交流】云南科情院赴杭“取经”数字赋能 调研轨物科技探路创新驱动
  • SAP学习笔记 - 开发31 - 前端Fiori开发 Device Adaptation(设备自适应)
  • 【实战指南】前端项目Nginx配置全流程:从打包部署到解决跨域/路由循环问题
  • 零基础学前端-传统前端开发(第三期-CSS介绍与应用)
  • JavaSE-Java简史
  • HTML5 定位网页元素
  • 火山引擎 veFuser:面向扩散模型的图像与视频生成推理服务框架
  • SQL 注入:iBatis与修复
  • 【python】预测投保人医疗费用,附insurance.csv数据集
  • 如何开始HarmonyOS 5与Godot引擎融合开发?
  • 中兴B860AV1.1_晨星MSO9280芯片_4G和8G闪存_TTL-BIN包刷机固件包
  • 如何“调优”我们自身的人体系统?
  • 嵌入式程序存储结构
  • postman调用接口报错401, Unauthorized, Invalid Token. null解决办法
  • 论文笔记 -《MegaBlocks- Efficient Sparse Training with Mixture-of-Experts》
  • 第27节 Node.js Buffer
  • 单位门户网站建设存在问题/网销怎么做
  • 番禺南村网站建设/做网页的网站
  • 做石油期货看什么网站/吉安seo招聘
  • 一级做a免费体验区不用下载网站/全网营销推广方案外包
  • 做直播信号网站/必应搜索引擎下载
  • 牡丹江网站建设公司/整合营销名词解释