(二)underscore.js框架Utility類API學習以及模型template的詳細介紹
本文介紹的是underscore.js提供的Utility Functions。
noConflict_.noConflict()
Give control of the "_" variable back to its previous owner. Returns a reference to theUnderscore object.
這個函式主要是為了解決underscore.js與其他框架或js名字衝突的問題。我們知道:underscore.js使用全域性物件_,如果在underscore框架載入前,已經有了這麼一個全域性變數會怎麼樣呢?
首先定義了一個全域性變數_,當underscore框架載入後,_之前的值被覆蓋。當呼叫_.noConflict()之後,該函式返回是underscore封裝的物件,仍然可以使用這個函式的返回值呼叫underscore.js提供的API。_被還原成underscore.js載入之前的值,就是11。<html> <head> <script> // 在underscore.js框架載入前執行,目的是驗證_.noConflict(); var _ = "11"; </script> <script src="underscore-1.7.0/underscore.js"></script> <script> //underscore是返回的underscore.js封裝物件 var underscore = _.noConflict(); alert(underscore.VERSION); // _之前是什麼,現在就還原成什麼. alert(_);//11 </script> </head> <body> </body> </html>
identity_.identity(value)
Returns the same value that is used as the argument. In math: f(x) = x
This function looks useless, but is used throughout Underscore as a default iteratee.
var moe = {name: 'moe'};
moe === _.identity(moe);
=> true
該函式啥也不做,就是直接返回傳遞給他的引數值,即數學中的f(x) = x。
constant_.constant(value)
Creates a function that returns the same value that is used as the argument of_.constant.
var moe = {name: 'moe'}; moe === _.constant(moe)(); => true該constant()返回值是一個函式(這個函式返回的就是傳遞給constant()函式的引數)。
noop_.noop()
Returns undefined irrespective(不管) of the arguments passed to it. Useful
as the default for optional callback arguments.
obj.initialize = _.noop;
noop就是no operation的縮寫,就是一個空函式,啥也不幹,返回值是undefined或者說是沒有返回值。有點像null object模式,避免使用者判空。
times_.times(n,
iteratee, [context])
Invokes the given iteratee function n times.
Each invocation of iteratee is
called with an index argument.
Produces an array of the returned values.
var result = _.times(3, function(i){return i * 10;})
console.log("times=" + result);// 0,10,20
result = _(3).times(function(i){ return i * 10; });
console.log("times=" + result);// 0,10,20
上面這2種寫法是等價的
random_.random(min,
max)
Returns a random integer between min and max, inclusive. If you only pass one argument, it will return a number between 0 and
that number.
_.random(0, 100);
=> 42
mixin_.mixin(object)
Allows you to extend Underscore with your own utility functions. Pass a hash of {name:
function} definitions to have your functions added to the Underscore object, as well as the OOP wrapper.
_.mixin({
capitalize: function(string) {
return string.charAt(0).toUpperCase() + string.substring(1).toLowerCase();
}
});
_("fabio").capitalize();
=> "Fabio"
uniqueId_.uniqueId([prefix])
Generate a globally-unique id for client-side models or DOM elements that need one. Ifprefix is passed, the id will be appended to it.
_.uniqueId('contact_'); => 'contact_104'返回id,在當前html是唯一的;或者說:同一個_物件內是唯一的
escape_.escape(string)
Escapes a string for insertion into HTML, replacing &, <, >, ", `,
and 'characters.
_.escape('Curly, Larry & Moe');
=> "Curly, Larry & Moe"
unescape_.unescape(string)
The opposite of escape, replaces &, <, >, ", ` and 'with
their unescaped counterparts.
_.unescape('Curly, Larry & Moe'); => "Curly, Larry & Moe"
result_.result(object,
property)
If the value of the named property is a function then invoke it with the object as context; otherwise, return it.
var object = {cheese: 'crumpets', stuff: function(){ return 'nonsense'; }}; _.result(object, 'cheese'); => "crumpets" _.result(object, 'stuff'); => "nonsense"
now_.now()
Returns an integer timestamp for the current time, using the fastest method available in the runtime. Useful for implementing timing/animation functions.
_.now(); => 1392066795351
template_.template(templateString,
[settings])
Compiles JavaScript templates into functions that can be evaluated for rendering. Useful for rendering complicated bits of HTML from
JSON data sources. Template functions can both interpolate variables, using <%= … %>,
as well as execute arbitrary JavaScript code, with <% … %>.
If you wish to interpolate a value, and have it be HTML-escaped, use <%- … %> When
you evaluate a template function, pass in a data object
that has properties corresponding to the template's free variables. The settingsargument
should be a hash containing any _.templateSettings that
should be overridden.
1、模板很類似JS模板引擎,如artTemplate、Handlebars、Mustache等JS模板框架,主要是為了避免在javascript中拼接DOM字串(非常的繁瑣,而且很容易出錯)。underscore.js提供的模板有三種使用方式:即<%= %>和<%- %>和<% %>。
// 替換普通變數
var varcompiled = _.template("<h2><%= word %></h2>");
console.log("template=" + varcompiled({word : "Hello World"}));
// 變數的值包含五個特殊字元(& < > " ' /),就需要用<%- ... %>轉義
var escape = _.template("<h2><%- word %></h2>");
console.log("template=" + escape({word : "Hello & World"}));
//JavaScript命令可以採用<% … %>的形式插入
var compiled = _.template("<% console.log('Hello ' + epithet); %>");
compiled({epithet: "hehe"});
2、改變變數預設名稱
//改變內部變數名稱
//templateString中的所有變數,在內部都是obj物件的屬性,而obj物件就是指第二個引數data物件。
// 下面語句是等同的。
console.log(_.template("Hello <%=user%>!")({ user: "jane" }));
console.log(_.template("Hello <%=obj.user%>!")({ user: "jane" }));
console.log(_.template("Hello <%=data.user%>!",{variable: 'data'})({ user: "jane" }));
3、通過編譯後函式的source屬性,檢視模板編譯的原始碼,便於定位問題
// 檢視預編譯的原始碼
console.log(_.template("Hello <%=user%>!").source);
4、模板格式的設定
之前提到過,underscore提供3種格式的模板<%= %>和<%- %>和<% %>。對應的原始碼如下:
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
我們知道<%= %>這種格式與JSP中嵌入java程式碼使用的方式一致,如果在JSP中寫java程式碼和underscore模板,那麼會衝突。我們通過設定,可以改變underscore模板的格式。下面的程式碼,用{}這種格式替換<%= %>
var newformat = _.template("Hello {user}!",{interpolate : /{([\s\S]+?)}/g});
console.log("result=" + newformat({ user: "jane" }));
5、還有一點值得注意,就是underscore提供的三種格式是可以一起使用的,這樣的話,模板裡面就可以寫if、while等邏輯控制了。比如有這麼一個物件,{"flag":true,"name":"aty","age":20},我們的模板需要根據flag的值進行判斷,如果是true,則返回name的值,如果是false則返回age的值。
//很類似於jsp中寫java
var tpt = "<% if (flag){ %>"
+ "<%= name %>"
+ "<% } %>";
+ "<% else {%>"
+ "<%= age %>"
+ "<% } %>";
var resultFunc = _.template(tpt);
console.log("result=" + resultFunc({"flag":true,"name":"aty","age":20}));
可以看到:這種使用方式,很型別與JSP中寫java程式碼,如果邏輯比較複雜,括號的巢狀層次比較多,那麼這種方式寫出的程式碼幾乎不可讀。上面的程式碼功能其實就是
if(flag)
{
return name;
}
else
{
return age;
}
可以看到直接寫javascript程式碼簡單的多。這也是underscore模板的不足之處,雖然支援寫javascript程式碼,但是非常複雜。等有時間我再去學習了專門的JS模板引擎,看它們是否能夠實現的更優雅。
最後,underscore_1.7.0版本中utility還提供了一個iteratee函式,這個函式也比較複雜,而且主要是框架內部使用。後續再專門研究這個函式,單獨寫一篇博文。
相關推薦
(二)underscore.js框架Utility類API學習以及模型template的詳細介紹
本文介紹的是underscore.js提供的Utility Functions。 noConflict_.noConflict()Give control of the "_" variable back to its previous owner. Returns a
Python(二)Python基本數據類型
python數據類型變量變量是內存中的一塊區域變量的命名:由字母、數字、下劃線組成並且開頭不能時數字python中地址變量與c語言剛好相反,一條數據包含多個標簽:>>> a=1>>> b=1>>> id(a)34909288>>> id(
(二)java集合框架綜述
args 目的 res arraylist 意義 lec 多少 多條 無序集合 一集合框架圖 說明:對於以上的框架圖有如下幾點說明 1.所有集合類都位於java.util包下。Java的集合類主要由兩個接口派生而出:Collection和Map,Colle
node.js學習日記(二)node.js的作用域
ejs nodejs 文件 node 報錯 info get log 一個 node.js的作用域 測試package1能否能通過require("./package2")來調用package2內的函數: 1 //paackage1.js 2 var a1 = 1; 3
(二)vue.js中axios的封裝(參考)
基於前文所述,axios 是一個基於Promise 用於瀏覽器和 nodejs 的 HTTP 客戶端,它有很多優秀的特性,例如攔截請求和響應、取消請求、轉換json、客戶端防禦XSRF等。 如果還對axios不瞭解的,可以移步axios文件,axios使用說明。 安裝 cnpm install axio
搭建eclipse+tomcat+maven+shiro+springmvc+jpa專案(二):基本框架搭建
1、pom.xml配置 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://m
java基礎-初級(二)【面向物件與類】
目錄 2、面向物件與類 2.1 面向物件思想 2.2 類與物件 2.3 成員和區域性變數 2.4 匿名物件 2.5 類的訪問許可權修飾符 2.6 static關鍵字-靜態域、靜態
spring整理(二)搭建SSM框架
搭建SSM框架 SSM框架說起來有點老生長談了,但還是手動搭一個吧 專案地址:https://github.com/yuzhou152/zgg-
Elastic Job 入門教程(二)— Spring Boot框架下是實現Elastic Job 指令碼作業(Script Job)
在Elastic Job 入門教程(一)— 與Spring Boot整合這篇文章中,我們簡單介紹了Spring Boot與Elastic Job 的整合,並簡單實現了SimpleJob型別作業。本章,我
SSM(二)MyBatis基本要素-核心類和介面
一、目標 瞭解MyBatis的三個基本要素 理解核心類和介面的作用域和生命週期 掌握SqlSession的兩種使用方式 二、MyBatis基本要素 1. MyBatis的核心介面和類 SqlSessionFactoryBuilder SqlSessionFacto
android記錄筆記(二)針對應用框架層梳理的整合筆記
這篇筆記主要是結合自我認知,加上各種學習資源,整理而成的查詢筆記,整理的不好,還望指出錯誤,主要是用於查詢與記錄,該篇筆記大多借鑑劉望舒的部落格,對大佬致敬哈,我也是你忠實的粉絲,如有冒犯,請見諒,我將立即刪除本篇文章。 針對應用框架層我認為必須要清楚的知識概念: 第一:
Python爬蟲(二):Scrapy框架的配置安裝
Windows安裝方式 預設支援Python2、Python3,通過pip安裝Csrapy框架: pip install Scrapy Ubuntu(9.10以上版本)安裝方式 預設支援Python2、Python3,通過pip安裝Csrapy框架: sud
前端構架配置(二)node.js、 webpack、css-loader、html-loader、style-loader、webpack-dev-server等外掛安裝總出錯解決方式
眾所周知,如果我們需要用到webpack打包,則需要做很多準備工作,包括node.js的安裝,webpack等的安裝。 這個安裝過程總會出現各種安裝不成功的情況。這裡不細說各種情況,直接給出一個最通用的解決方案。 方案如下:核心是配套好各個外掛的版本號,如
Xposed框架開發入門(二)--使用Xposed框架實現Activity跳轉攔截
接著上一篇Xposed框架入門開發(一)繼續,在上一篇中已經說了,第二篇主要介紹的是Xposed框架開發的基礎的應用。在接下來的文章中,主要以一個Activity的跳轉APP為例, 示範Xposed框架的基本使用方法。 1、編寫一個簡單的Activity跳
Node.js從入門到實戰(二)Node.js基本用法
參考: 一、Node.js中的模組 Node.js使用require引入依賴的模組,因此模組是Node.js中的重要組成部分,這篇部落格主要羅列一下常用的Node.js模組,並且在後期會新增在工作中用到的模組參考備用。 二、Node.js EventEmitter Node
(二)java生成隨機數工具類RandomUtils詳解
/** * 生成一個隨機的布林值 */ boolean flag = RandomUtils.nextBoolean();
ElasticSearch學習 - (二)Node.js安裝及環境配置之Windows篇
一、安裝環境 1、本機系統:Windows 10 Pro(64位) 2、Node.js:node-v10.14.2-x64.msi(64位) 二、安裝Node.js步驟 1、下載對應你係統的Node.js版本:https://nodejs.org/en/download
使用Python進行層次聚類(二)——scipy中層次聚類的自定義距離度量問題
今天,總結一下如何使用層次聚類演算法裡面的自定義距離度量 層次聚類上次已經總結過。 這次僅僅說明層次聚類的距離引數,這裡的距離引數可以使用自定義函式。 我們進入該函式的文件頁面我們看到linkage的說明文件上面的函式scipy.cluster.hiera
Java容器學習筆記(二) Set介面及其實現類的相關知識總結
在Java容器學習筆記(一)中概述了Collection的基本概念及介面實現,並且總結了它的一個重要子介面List及其子類的實現和用法。 本篇主要總結Set介面及其實現類的用法,包括HashSet(無序不重複),LinkedHashSet(按放入順序有序不重複),TreeS
用Java實現JVM(二):支援介面、類和物件
1. 概述我的 JVM 已經能夠執行HelloWorld了,並且有了基本的 JVM 骨架,包括執行時資料結構的定義(棧、棧幀、運算元棧等),執行時的邏輯控制等。但它還沒有類和物件的概念,比如無法執行下面這更復雜的HelloWorld:public interface SpeakerInterface {