您好,登錄后才能下訂單哦!
引子
在Express.js 4.x框架中存在兩個locals定義。一個是Express本身帶有的locals屬性(Object類型),另一個是Response的locals屬性(Object類型)。
在本文中,我們來討論一下Express本身帶有的locals屬性用法。
Express.js 2.x時代
先看歷史:在Express.js 2.x時代,還沒有出現(xiàn)locals,而是使用app.helpers 和app.dynamicHelpers 。在express2.X中,你可以使用它們分別作為靜態(tài)/動態(tài)視圖助手工具。
有一個簡單的例子,如下:
app.helpers({
<span ></span>inspect: function(obj) {
<span ></span>return util.inspect(obj, true);
}
});
Express.js 3.X/4.X時代
如今,Express本身帶有的locals屬性把上述兩個Helper替換掉了。官方說法是:
The app.locals
object is a JavaScript object, and its properties are local variables within the application.
也就是說,你可以在Express程序的生命周期內(nèi)為其locals這個對象屬性定義任意你喜歡的屬性(當(dāng)然包括函數(shù)),然后在你需要的地方使用。但是,有重要提示與說明,如下:
Once set, the value of app.locals
properties persist throughout the life of the application, in contrast with res.locals properties that are valid only for the lifetime of the request.
You can access local variables in templates rendered within the application. This is useful for providing (1)helper functions to templates, as well as (2)app-level data. Note, however, that you CANNOT access local variables in middleware.
上面的E文不用我翻譯了,翻譯得拙劣反而會歪曲的原文主旨。
因此,作者在新版本中作上述更新(當(dāng)然是替換)是極有道理的。因此,在新版本中(時下最流行的自然是4.X),locals的作用進一步擴展,而不僅限于作為模板視圖的工具函數(shù)使用。
值得注意的是,3.X與4.X中也有一些不同(摘錄http://blog.csdn.net/ling369523246/article/details/49487509的例子如下):
............ 但是在express 3.x后 這兩個方法被廢止。 3.x 使用的是 app.locals({ 就有如下: app.locals({ 但是express4.x后變化就很大了 app.locals.key1 = value1;app.locals.key2 = value2; 如下:app.locals.inspect=function(obj){ |
在.jade模板中使用locals簡介
至于在.jade等模板中如何使用locals中定義的屬性,在stackoverflow中有相應(yīng)的解決,而且來自express.js作者TJ Holowaychuck,示例及說明如下。
下面這一段不是來自EXPRESS.JS作者(盡管使用的是3.0,現(xiàn)在不再有):
Here is an example using a fresh installation of express v3.0.0rc4 app.js: app.use(function(req, res, next){ res.locals.variable="Hello locals from Response!"; next(); } ) app.configure(function(){ app.set('port', process.env.PORT || 3000); app.set('views', __dirname + '/views'); app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.static(path.join(__dirname, 'public'))); }); index.jade: extends layout block content h2= title p Welcome to #{title} p=variable |
注意,上面例子中使用了Response對象中定義的locals,運行結(jié)果如下圖所示:
來自express.js作者TJ Holowaychuck的上述使用忠告則強調(diào)了使用順序:
the one key thing you have to remember (currently), is that all of the routes (app.get, app.put, etc) are part of a routing middleware called app.router (this is an instance of a Router). So app.use() works with individual middleware, so if you call it between two app.get() calls for example it's not actually added between them. so you might want to do something like: (這里使用示例說明使用順序的問題) app.use(loadViewData); app.use(app.router); app.get('/..... that way it's before the routes. I should note that I've played with each app.{get,put,...}() call being its own middleware, which is nice in a lot of ways but I need to improve the performance of that solution before considering it |
使用了Express對象中定義的locals簡介
使用Express對象中定義的locals詳細分析起來要復(fù)雜一些。正如上面解釋的,至少應(yīng)當(dāng)考慮兩種情形:在模板引擎中如何使用Express對象中定義的locals;第二,作為app-level data如何使用Express對象中定義的locals。
在此,僅看一下第一種情形的舉例。
在app.js中,有如下定義:
app.use(function(req, res, next){ app.locals.appvariable={ "key1":"Hello locals", "key2":121, "startX":function(){console.log("xxxxxxxxxx.");} }; app.locals.tt=function(){console.log("MMMMMMMMMMM");}; //app.locals.startX=function(para1,para2){ // console.log("Now start starting..."); //}; res.locals.variable = "Hello locals from Response!"; next();//MUST HAVE });
那么,在模板文件index.jade中可以使用如下表達方式:
extends layout
block content
h2= title
p Welcome to #{title}
p=variable
br
h3=appvariable.key1
關(guān)于更一般作為express應(yīng)用程序生命周期內(nèi)data使用的locals屬性的用法,在此恕不介紹,有興趣的朋友可以進一步探討這方面的應(yīng)用。
關(guān)于Express中的locals屬性用法討論至此,歡迎一起作進一步探討......
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。
億速云公眾號
手機網(wǎng)站二維碼
Copyright ? Yisu Cloud Ltd. All Rights Reserved. 2018 版權(quán)所有
廣州億速云計算有限公司粵ICP備17096448號-1 粵公網(wǎng)安備 44010402001142號增值電信業(yè)務(wù)經(jīng)營許可證編號:B1-20181529