热门标签 | 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



推荐阅读
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 网址:https:vue.docschina.orgv2guideforms.html表单input绑定基础用法可以通过使用v-model指令,在 ... [详细]
  • HTML5网页模板怎么加百度统计?
    本文介绍了如何在HTML5网页模板中加入百度统计,并对模板文件、css样式表、js插件库等内容进行了说明。同时还解答了关于HTML5网页模板的使用方法、表单提交、域名和空间的问题,并介绍了如何使用Visual Studio 2010创建HTML5模板。此外,还提到了使用Jquery编写美好的HTML5前端框架模板的方法,以及制作企业HTML5网站模板和支持HTML5的CMS。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • 本文介绍了使用jQuery实现图片预加载和等比例缩放的方法,同时提供了演示和相关代码。该方法可以重置图片的宽度和高度,并使图片在水平和垂直方向上居中显示。 ... [详细]
  • 获取ul中第一个li元素的五种方法和多个ul中第一个li元素的四种方法
    本文介绍了获取ul中第一个li元素的五种方法和多个ul中第一个li元素的四种方法,包括使用jQuery的选择器和遍历方法。通过这些方法,可以方便地获取到所需的元素,并进行相应的操作。 ... [详细]
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社区 版权所有