在頁面加載時,就須要顯示在頁面上的數據,能夠在後臺使用this.assign賦值,在前臺經過ejs等模板獲取;用戶點擊按鈕,或者觸發某些事件和後臺進行交互時,就須要用到ajax調用後臺接口。本文經過一個例子講述這兩種方法的先後臺實現。(方便起見,使用jQuery封裝的ajax)'html
(ps:ajax調用後臺接口的情形一般是用戶觸發事件,給後臺傳遞一些前臺的數據,而後後臺根據這些數據進行相關操做,再返回前臺一些數據。舉個表單提交的例子,用戶點擊提交按鈕以後,將填寫的表單信息傳遞個後臺,後臺對傳過來的表單信息進行驗證,並存儲的數據庫中,若是這兩個過程都成功完成,返回前端一個true,若是失敗,返回false。而後前端經過接收到的true和false給出用戶相應的提示。)前端
通常網站都會有用戶的我的中心,用戶能夠經過填寫表單修改我的信息,下面就以此種情形爲例。(user模塊,personal控制器,index方法爲頁面顯示,update方法爲更新我的信息)ajax
this.assign配合模板傳遞數據數據庫
首先是前端HTML。一個我的信息的表單。/view/user/personal_index.htmljson
<form> <div class="form-group"> <label for="inputNickname">Nickname</label> <input type="text" class="form-control" id="inputNickname" name="inputNickname" value="{{userInfo.user_name}}"> </div> <div class="form-group"> <label for="inputEmail">Email</label> <input type="Email" class="form-control" id="inputEmail" name="inputEmail" value="{{userInfo.user_mailbox}}"> </div> <div class="form-group"> <label for="inputTell">Tellphone</label> <input type="number" class="form-control" id="inputTell" name="inputTell" value="{{userInfo.user_tellphone}}"> </div> <div class="form-group"> <label for="inputCity">City</label> <input type="text" class="form-control" id="inputCity" name="inputCity" value="{{userInfo.user_city}}"> </div> <div class="form-group"> <label for=""></label> <button type="submit" class="btn btn-primary">Update Your Information</button> </div> </form>
這裏使用的是nunjucks模板,打開這個頁面時,表單中應該顯示用戶已有的信息,因此在/src/user/controller/personal.js的index方法裏應該經過this.assign將用戶信息賦給前臺。緩存
/src/user/controller/personal.jssession
async indexAction(){ let userInfo = await this.session('userInfo');
return this.display(); }
由於是用戶信息是在用戶登陸時就獲取到而後存在緩存裏的,因此這裏是直接從緩存裏獲取,若是沒有獲取到用戶信息須要從新登陸,跳轉到登陸頁面。若是用戶信息存在就賦值給userInfo變量,而後在前端的value中獲取到這個變量的值。有一點須要注意的是,使用模板時,雙括號須要寫在雙引號裏面,不然渲染出來獲取到的值不在input的value裏。'async
Ajax傳遞數據:函數
當用戶修改表單中的值,並點擊提交按鈕以後,須要將這些數據傳送的後臺,雖然能夠直接在form的action屬性裏面寫上後臺的方法路徑,method裏面指定提交的方式,可是這種提交不便於獲取返回的數據,並且會進行頁面跳轉,刷新等默認行爲。因此經過ajax來傳送數據,並經過回調獲取返回的數據就能夠避免以上這些狀況發生。post
前端personal_index.html引用的js文件:/www/static/js/personal.js
$(function(){ $('form').submit(evt=>{ evt.preventDefault(); $.ajax({ url: '/user/personal/update', type: 'POST', dataType: 'json', data: $('form').serialize(), success:res=>{ if(!res.errno) { alert('Update Successfully!'); window.location.reload(); } else alert(res.errmsg); } }); }); });
form的submit事件就是默認的表單提交事件,好比點擊表單內type爲submit的button或者input,在輸入框中按下回車等。evt表明當前的事件,evt.preventDefault()就是阻止表單默認提交(經過form的action和method默認提交到對應方法)。而後經過ajax方法將表單信息傳遞給後臺。ajax的使用方法如上面所示,url寫對應方法的地址,形式就是'/模塊名/控制器名/方法名',type是'POST'或者'GET',dataType是數據類型,這裏是json,data是傳遞的數據,form能夠簡單的經過$('form').serialize()來獲取到表單的全部數據(序列化返回的結果舉例:name=Kate&city=WuHan,與表單默認提交一致,input的name值和value值對應傳給後臺)。success是成功傳給後臺而且後臺處理成功後的回調函數,res就是後臺的返回值,若是成功,那麼彈出更新成功的提示框,而且從新加載頁面,用戶信息也會更新。若是失敗,那麼彈出失敗的提示框。
/src/user/controller/personal.js
async updateAction(){ let formInfo = this.post(); let userList = this.model('user'); let list = this.model('list'); let userInfo = await this.session('userInfo'); let affectedRows = 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});
//更新緩存 let user = await userList.where({user_loginname: userInfo.user_loginname}).find(); await this.session('userInfo',user); this.success(); }
首先經過this.post()獲取表單傳過來的數據存到formInfo中(會轉化成鍵值對的形式,就是js中對象的形式),而後更新這個用戶數據庫中的數據(經過user_uid這個用戶惟一標識查找到該用戶信息,並更新),再將更新後的信息存入緩存(注:本文是拿用戶信息舉例,因此要從緩存中讀取,並存入緩存,其它狀況可能並不須要使用session),若是有錯或者沒有成功改變,那麼經過this.fail返回,前端回調函數獲取到的res.errno爲1000,'update failed!'能夠經過前端的res.errmsg獲取到, 完成以後經過this.success()返回(如需返回數據,將數據做爲this.success()的參數便可,在前端回調中經過res.data獲取到這個數據),前端回調獲取到的res.errno爲0。因此在前端js文件中ajax的success回調函數裏,只須要判斷res.errno便可知道後臺執行相關操做的成功與否。
注: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