1. 程式人生 > >(二)underscore.js框架Utility類API學習以及模型template的詳細介紹

(二)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框架載入前,已經有了這麼一個全域性變數會怎麼樣呢?

<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> 
首先定義了一個全域性變數_,當underscore框架載入後,_之前的值被覆蓋。當呼叫_.noConflict()之後,該函式返回是underscore封裝的物件,仍然可以使用這個函式的返回值呼叫underscore.js提供的API。_被還原成underscore.js載入之前的值,就是11。

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 &amp; Moe"

unescape_.unescape(string) 
The opposite of escape, replaces &amp;&lt;&gt;&quot;&#96; and &#x27;with their unescaped counterparts.

_.unescape('Curly, Larry &amp; 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框架UtilityAPI學習以及模型template詳細介紹

本文介紹的是underscore.js提供的Utility Functions。 noConflict_.noConflict()Give control of the "_" variable back to its previous owner. Returns a

PythonPython基本數據

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型別作業。本章,我

SSMMyBatis基本要素-核心和介面

一、目標 瞭解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 {