(二)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;` and '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函数,这个函数也比较复杂,而且主要是框架内部使用。后续再专门研究这个函数,单独写一篇博文。

时间: 2024-10-10 06:05:55

(二)underscore.js框架Utility类API学习以及模型template的详细介绍的相关文章

(三)underscore.js框架Objects类API学习

keys_.keys(object) Retrieve all the names of the object's properties. _.keys({one: 1, two: 2, three: 3}); => ["one", "two", "three"] values_.values(object) Return all of the values of the object's properties. _.values({one

java SE学习之线程同步(详细介绍)

       java程序中可以允许存在多个线程,但在处理多线程问题时,必须注意这样一个问题:               当两个或多个线程同时访问同一个变量,并且一些线程需要修改这个变量时,那么这个程序是该如何执行?              也就是先访问这个变量还是先修改这个变量.              在学习线程的这段时间里,我也一直被这个问题所困扰!但是今天终于算是搞明白了.              于是将这些好的列子一一列举出来,分享一下. (1)什么是线程同步 ?      

java.time包常用类API学习记录

Java8出来已那么多年了,java.time包之前一直没有使用过,最近正好有用到,在此做个记录. 上图列出了java.time包下的类,接下来我们详细看下其中每个类的用法. Clock:获取到当前时间点,包含时区信息,该类是抽象类,其实现类由其内部类实现,也可以自定义其实现类. Clock方法描述: getZone():获取创建日期时间的时区: withZone(ZoneId zone):返回一个指定时区clock副本: instant():返回instant实例: millis():获取当前

Js数组的操作push,pop,shift,unshift等方法详细介绍

js中针对数组操作的方法还是比较多的,今天突然想到来总结一下,也算是温故而知新吧.不过不会针对每个方法进行讲解,我只是选择其中的一些来讲. 首 先来讲一下push和pop方法,这两个方法只会对数组从尾部进行压入或弹出,而且是在原数组进行操作,任何的改动都是会影响到操作的数组. push(args)可以每次压入多个元素,并返回更新后的数组长度.pop()函数每次只会弹出最后一个结尾的元素,并返回弹出的元素,如果是对空组数 调用pop()则返回undefined. 如果参数是数组则是将整个数组当做一

JS 事件绑定、事件监听、事件委托详细介绍

事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有三种常用的绑定事件的方法: 在DOM元素中直接绑定: 在JavaScript代码中绑定: 绑定事件监听函数. 在DOM中直接绑定事件 我们可以在DOM元素上绑定onclick.onmouseover.onmouseout.onmousedown.onmouseup.ondblclick.onkeyd

(一)underscore入门和数组类工具API学习

underscore.js是一个JS框架,在原生javascript基础上提供了很多有用的工具API.apache提供了commons-lang.commons-io.commons-collections等jar包提供很多java语言常用的工具方法,underscore.js功能与之类似.经常开发JS代码的都知道,JS原生的Array.String等内置的API很少,不能满足实际开发过程中国的需要.所以引入一些工具库很有必要,避免我们重复的写一些本来应该公用的方法. 1.学习资料 unders

基于asp.net + easyui框架,一步步学习easyui-datagrid——实现分页和搜索(二)

http://blog.csdn.net/jiuqiyuliang/article/details/19967031 目录: 基于asp.net + easyui框架,一步步学习easyui-datagrid——界面(一) 基于asp.net + easyui框架,一步步学习easyui-datagrid——实现分页和搜索(二) 基于asp.net + easyui框架,一步步学习easyui-datagrid——实现添加.编辑.删除(三) 基于asp.net + easyui框架,一步步学习e

underscore.js学习笔记

最近项目需要,开始学习underscore.js,在css88网站上看到有中文API,边看边记录自己能理解的笔记: 以下内容,函数以及部分解释抄自css88愚人码头中文API 内容还在整理中,发出部分 /** *@方法参数解释 *iterator 为迭代器,该函数会获取前面数组或者对象的值作为参数传入,并且一个个进行处理 * predicate 为真值检测,该函数会将前面数组或者对象的值作为参数传入,并根据函数内容进行判断,如果能匹配上则返回true,否则返回false * @函数参数解释 *

node.js框架StrongLoop学习笔记(一)

node.js框架StrongLoop学习笔记(一) 本人在用node.js做手机后台,查找框架发现StrongLoop挺适合,可是却发现没有中文教程,于是在自己学习时,做一下笔记,以方便其他像我一样的人参考(本人的英语水平非常差,只能一点点试着做,并记录下来,如果大家发现问题,请通知我好更正,谢谢了!).所有操作都是在CentOS7-x64,Node.js 0.12.2下完成的. nodejs框架StrongLoop学习笔记一 安装StrongLoop 创建项目 安装数据库驱动 配置数据库连接