热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

thinkjs学习this.assign传递数据和ajax调用后台接口

在页面加载时,就需要显示在页面上的数据,可以在后台使用this.assign赋值,在前台通过ejs等模板获取;用户点击按钮&

在页面加载时,就需要显示在页面上的数据,可以在后台使用this.assign赋值,在前台通过ejs等模板获取;用户点击按钮,或者触发某些事件和后台进行交互时,就需要用到ajax调用后台接口。本文通过一个例子讲述这两种方法的前后台实现。(方便起见,使用jQuery封装的ajax)'

(ps:ajax调用后台接口的情形通常是用户触发事件,给后台传递一些前台的数据,然后后台根据这些数据进行相关操作,再返回前台一些数据。举个表单提交的例子,用户点击提交按钮之后,将填写的表单信息传递个后台,后台对传过来的表单信息进行验证,并存储的数据库中,如果这两个过程都成功完成,返回前端一个true,如果失败,返回false。然后前端通过接收到的true和false给出用户相应的提示。)

一般网站都会有用户的个人中心,用户可以通过填写表单修改个人信息,下面就以此种情形为例。(user模块,personal控制器,index方法为页面显示,update方法为更新个人信息)

this.assign配合模板传递数据

首先是前端HTML。一个个人信息的表单。/view/user/personal_index.html

<form><div class&#61;"form-group"><label for&#61;"inputNickname">Nicknamelabel><input type&#61;"text" class&#61;"form-control" id&#61;"inputNickname" name&#61;"inputNickname" value&#61;"{{userInfo.user_name}}">div><div class&#61;"form-group"><label for&#61;"inputEmail">Emaillabel><input type&#61;"Email" class&#61;"form-control" id&#61;"inputEmail" name&#61;"inputEmail" value&#61;"{{userInfo.user_mailbox}}">div><div class&#61;"form-group"><label for&#61;"inputTell">Tellphonelabel><input type&#61;"number" class&#61;"form-control" id&#61;"inputTell" name&#61;"inputTell" value&#61;"{{userInfo.user_tellphone}}">div><div class&#61;"form-group"><label for&#61;"inputCity">Citylabel><input type&#61;"text" class&#61;"form-control" id&#61;"inputCity" name&#61;"inputCity" value&#61;"{{userInfo.user_city}}">div><div class&#61;"form-group"><label for&#61;"">label><button type&#61;"submit" class&#61;"btn btn-primary">Update Your Informationbutton>div>form>

这里使用的是nunjucks模板&#xff0c;打开这个页面时&#xff0c;表单中应该显示用户已有的信息&#xff0c;所以在/src/user/controller/personal.js的index方法里应该通过this.assign将用户信息赋给前台。

/src/user/controller/personal.js

async indexAction(){let userInfo &#61; await this.session(&#39;userInfo&#39;);

if (think.isEmpty(userInfo)) {
this.redirect(&#39;/user/login/index&#39;);
}
this.assign(&#39;userInfo&#39;,userInfo);

return this.display();}

因为是用户信息是在用户登录时就获取到然后存在缓存里的&#xff0c;所以这里是直接从缓存里获取&#xff0c;如果没有获取到用户信息需要重新登录&#xff0c;跳转到登录页面。如果用户信息存在就赋值给userInfo变量&#xff0c;然后在前端的value中获取到这个变量的值。有一点需要注意的是&#xff0c;使用模板时&#xff0c;双括号需要写在双引号里面&#xff0c;否则渲染出来获取到的值不在input的value里。&#39;

Ajax传递数据&#xff1a;

当用户修改表单中的值&#xff0c;并点击提交按钮之后&#xff0c;需要将这些数据传送的后台&#xff0c;虽然可以直接在form的action属性里面写上后台的方法路径&#xff0c;method里面指定提交的方式&#xff0c;但是这种提交不便于获取返回的数据&#xff0c;而且会进行页面跳转&#xff0c;刷新等默认行为。所以通过ajax来传送数据&#xff0c;并通过回调获取返回的数据就可以避免以上这些情况发生。

前端personal_index.html引用的js文件&#xff1a;/www/static/js/personal.js

$(function(){$(&#39;form&#39;).submit(evt&#61;>{evt.preventDefault();$.ajax({url: &#39;/user/personal/update&#39;,type: &#39;POST&#39;,dataType: &#39;json&#39;,data: $(&#39;form&#39;).serialize(),success:res&#61;>{if(!res.errno) {alert(&#39;Update Successfully&#xff01;&#39;);window.location.reload();}else alert(res.errmsg);}});});
});

form的submit事件就是默认的表单提交事件&#xff0c;比如点击表单内type为submit的button或者input&#xff0c;在输入框中按下回车等。evt代表当前的事件&#xff0c;evt.preventDefault()就是阻止表单默认提交&#xff08;通过form的action和method默认提交到对应方法&#xff09;。然后通过ajax方法将表单信息传递给后台。ajax的使用方法如上面所示&#xff0c;url写对应方法的地址&#xff0c;形式就是&#39;/模块名/控制器名/方法名&#39;&#xff0c;type是&#39;POST&#39;或者&#39;GET&#39;,dataType是数据类型&#xff0c;这里是json&#xff0c;data是传递的数据&#xff0c;form可以简单的通过$(&#39;form&#39;).serialize()来获取到表单的所有数据&#xff08;序列化返回的结果举例&#xff1a;name&#61;Kate&city&#61;WuHan&#xff0c;与表单默认提交一致&#xff0c;input的name值和value值对应传给后台&#xff09;。success是成功传给后台并且后台处理成功后的回调函数&#xff0c;res就是后台的返回值&#xff0c;如果成功&#xff0c;那么弹出更新成功的提示框&#xff0c;并且重新加载页面&#xff0c;用户信息也会更新。如果失败&#xff0c;那么弹出失败的提示框。

/src/user/controller/personal.js

async updateAction(){let formInfo &#61; this.post();let userList &#61; this.model(&#39;user&#39;);let list &#61; this.model(&#39;list&#39;);let userInfo &#61; await this.session(&#39;userInfo&#39;);let affectedRows &#61; await userList.where({user_uid: userInfo.user_uid}).update({user_name:formInfo.inputNickname,user_mailbox:formInfo.inputEmail,user_tellphone:formInfo.inputTell,user_city:formInfo.inputCity});

if(!affectedRows){ this.fail(1000,&#39;update failed!&#39;); }

//更新缓存let user &#61; await userList.where({user_loginname: userInfo.user_loginname}).find();await this.session(&#39;userInfo&#39;,user);this.success();}

首先通过this.post()获取表单传过来的数据存到formInfo中&#xff08;会转化成键值对的形式&#xff0c;就是js中对象的形式&#xff09;&#xff0c;然后更新这个用户数据库中的数据&#xff08;通过user_uid这个用户唯一标识查找到该用户信息&#xff0c;并更新&#xff09;&#xff0c;再将更新后的信息存入缓存&#xff08;注&#xff1a;本文是拿用户信息举例&#xff0c;所以要从缓存中读取&#xff0c;并存入缓存&#xff0c;其它情况可能并不需要使用session&#xff09;&#xff0c;如果有错或者没有成功改变&#xff0c;那么通过this.fail返回&#xff0c;前端回调函数获取到的res.errno为1000&#xff0c;&#39;update failed!&#39;可以通过前端的res.errmsg获取到&#xff0c; 完成之后通过this.success()返回&#xff08;如需返回数据&#xff0c;将数据作为this.success()的参数即可&#xff0c;在前端回调中通过res.data获取到这个数据&#xff09;&#xff0c;前端回调获取到的res.errno为0。所以在前端js文件中ajax的success回调函数里&#xff0c;只需要判断res.errno即可知道后台执行相关操作的成功与否。

注&#xff1a;this.success和this.fail的用法参照https://thinkjs.org/zh-cn/doc/2.2/controller.html#toc-c6a和https://thinkjs.org/zh-cn/doc/2.2/controller.html#toc-060

转:https://www.cnblogs.com/katelee/p/7469114.html



推荐阅读
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • Framework7:构建跨平台移动应用的高效框架
    Framework7 是一个开源免费的框架,适用于开发混合移动应用(原生与HTML混合)或iOS&Android风格的Web应用。此外,它还可以作为原型开发工具,帮助开发者快速创建应用原型。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 本文讨论了在进行 MySQL 数据迁移过程中遇到的所有 .frm 文件报错的问题,并提供了详细的解决方案和建议。 ... [详细]
  • 本文介绍了如何利用 `matplotlib` 库中的 `FuncAnimation` 类将 Python 中的动态图像保存为视频文件。通过详细解释 `FuncAnimation` 类的参数和方法,文章提供了多种实用技巧,帮助用户高效地生成高质量的动态图像视频。此外,还探讨了不同视频编码器的选择及其对输出文件质量的影响,为读者提供了全面的技术指导。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 该大学网站采用PHP和MySQL技术,在校内可免费访问某些外部收费资料数据库。为了方便学生校外访问,建议通过学校账号登录实现免费访问。具体方案可包括利用学校服务器作为代理,结合身份验证机制,确保合法用户在校外也能享受免费资源。 ... [详细]
  • 在《ChartData类详解》一文中,我们将深入探讨 MPAndroidChart 中的 ChartData 类。本文将详细介绍如何设置图表颜色(Setting Colors)以及如何格式化数据值(Formatting Data Values),通过 ValueFormatter 的使用来提升图表的可读性和美观度。此外,我们还将介绍一些高级配置选项,帮助开发者更好地定制和优化图表展示效果。 ... [详细]
  • 本文汇集了我在网络上搜集以及在实际面试中遇到的前端开发面试题目,并附有详细解答。无论是初学者还是有一定经验的开发者,都应深入理解这些问题背后的原理,通过系统学习和透彻研究,逐步形成自己的知识体系和技术框架。 ... [详细]
  • 在 Vue 应用开发中,页面状态管理和跨页面数据传递是常见需求。本文将详细介绍 Vue Router 提供的两种有效方式,帮助开发者高效地实现页面间的数据交互与状态同步,同时分享一些最佳实践和注意事项。 ... [详细]
author-avatar
Smile--麦芽
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有