前面几篇 Backbone.js 的例子中有使用到 template, 及数据的填充,其实这已经很接近 Model 了。现在来学习怎么创建自己的 Model 类,并简单的使用。Backbone.js 中 Model 会涉及到很多的概念,如 Model 的初始化,默认值,属性的读写,属性值改变的监听,数据渲染,校验,以及与服务端的数据同步等。
本文不打算讲前面大部分的内容,最初思考的一个脉络是怎么把 Model 引入进来,所以线索会是建立 Model 类 -> 初始化 Model 实例 -> 设置值 -> 渲染到页面,其余 Model 特性分别再深入。
直观地能想到的 JavaScript 的 Model 是一个 JSON 对象,差不多,不过 Backbone 赋予 Model 默认属性,只能通过 getter/setter 方法来访问 Model 中的属性值,不能直接用点操作符,相当于 Backbone 的属性是私有的。 Read More
使用 Backbone 的 View 时,可以象传统 jQuery 那样定义事件,$("selector").click(function(){...})。幸运的是 Backbone 让我们在 View 中定义事件变得更为简单和集中,只要设置 View 的events属性,配置 事件,元素以及相应的处理方法,基本模式如下:格式是1events: { 2 "click button": "event_handler", 3 "focus #name": "event_handler" 4}, 5 6event_handler: function( event ) { 7 alert(event.target.id); 8}"事件 选择器": "事件处理函数名", 奇怪为什么这里不是使用事件处理函数名的引用,也就是不能写成下面两种方式: Read More
前面一篇 Backbone.js HelloWorld,应用起步 只是让 Backbone 跑起来,实际的应用中会使用到模板,Model 等,而模板又是进阶的基础。所以这里介绍在 View 中使用模板,以及如何向模板填充值,模板可以用字符串,或是用 <script type="text/template"> 声明的内容。使用 <%= %> 或 <%- %> 来声明变量输出的占位符。
Backbone 的模板要用到的是 underscore.js 库, 要深入了解 Unserscore 就看官方的 Underscore.js 的文档,Underscore 的 template 方法的原型如下:_.template(templateString, [data], [settings])
Read More- 本人博客几经周折,最初 BPS,到独立的域名、空间,每一次也是为向更自由的管理迈进一步。现在终于搞了个 VPS,不过是在美国的,慢是慢了点,不过自己想怎么弄就怎么弄,现也无需经常性的找客服了。
VPS 是 768M RAM, 1536 的交换空间,40G硬盘空间,2500G带宽,两固定 IP,其实我只要一个就行了。服务器是在我所在的城市,所以管理起来应该要快些,至少感觉会有点。
基于系统资源和稳定性的考虑,我选择了 Debian 系统,Ubuntu 就是基于它的。在一个干净的系统上要搭建 Wordpress 需要预先准备好 Apache2+PHP5+MySQL5 这样的环境,Apache2 是以 worker 模式运行,PHP 是 FastCGI 方式,Wordpress 连接 MySQL 可以本地 Socket 方式。下面是步骤:一. 系统设置
配置时区,方便查看日志能对应上你当地的时间#dpkg-reconfigure tzdata
选择相应的城市,这步会修改 /etc/timezone 和 /etc/localtime 文件 Read More - 之前也有记录过一篇是针对 All in One SEO Pack 1.6.X 的解决截取中文描述的办法--让All in One SEO Pack 插件适用于截取中文描述,随着该插件一直升级到当前的 2.1.2,我的插件仍然滞留在 1.6.x 的版本,原因是未曾了解下 2.x 下如何处理中文描述的问题。现在有幸找来办法整理了下,特记录在下:
中间插一句,All in One SEO Pack 可真是个吃内存的大户,小心使用。好,和针对 1.6.x 版本的修改一样,对于 2.x 也是要改两个变量值和一个方法,那就是在 aioseop.class.php 文件中
改下面两个变量分别为var $maximum_description_length = 300; //原本为 160;
然后修改方法 trim_excerpt_without_filters($text) 的内容为 Read More
var $minimum_description_length = 80;//原本为 1;
Backbone 是一个 JavaScript 框架,可用于创建模型-视图-控制器 (model-view-controller, MVC) 类应用程序和单页界面。它试图让 JavaScript 应用程序更清晰结构化,所涉及到的概念有 View, Event, Model, Collection 和 Router,所以新手刚开始接触 Backbone 反而会显得零乱了。再加上网上找来的一些起步教程一上来就把 Event, Model, Collection 或是 Router 揽上了。其实新手最想要一个最简单的真相,因此第一个例子只需用到 View,其他的玩艺暂且搁置。
Backbone 强依赖于 Underscore,jQuery 是可选的,不过为操作 DOM 方便一般都会引用到 jQuery。
最简单的例子,分两步走:
1. Backbone.View.extend(obj) 创建一个 View 类型
2. 创建上一步得到的 View 的实例,实例化时将会调用前一步 obj.initialize() 方法
上代码(为方便起见,所有 JS 脚本都从公网上加载): Read More- 比如要写一个 JavaScript 的日志输出工具,在方法 log.info() 中能得到调用它所在的文件和代码行号。和众多的日志工具一样,像 log4j, 都是在程序代码中主动抛出异常,然后从异常栈中去查找到调用者所在的代码行和文件名。 不过也就刚刚才了解到 JavaScript V8 引擎提供了自己的 StackTrace API,Chrome 和 Node.js 可用。 先来看可通用的 JavaScript 抛异常 throw new Error() 的方式,下面的代码:点击链接 http://jsfiddle.net/Unmi/53xas/ 执行,其中是用 document.write() 输出的,完整异常栈是: Read More
1var log = { 2 info: function(arg){ 3 try { 4 throw new Error(); 5 } catch (e) { 6 alert("Stack:" + e.stack); 7 var loc= e.stack.replace(/Error\n/).split(/\n/)[1].replace(/^\s+|\s+$/, ""); 8 alert("Location: "+loc+""); 9 } 10 } 11}; 12 13function foo(){ 14 log.info(123); 15} 16 17foo(); - 从 ECMAScript 5th Edition 开始,JavaScript 内建了 JSON 对象,用来处理 JSON 的序列化和反序列化,有以下几个方法原型
JSON.stringify(obj [,filter] [,indent])
JSON.parse(text [,reviver])
jQuery 也提供了 jQuery.parseJSON 方法,但是没有相应的序列化方法。
如果用 JSON.stringify() 来对一个有循环引用的 JSON 对象进行序列化,会产生 TypeError: cyclic object value 异常,类似下面的代码点击链接 http://jsfiddle.net/Unmi/6eLFF/ 运行上面的代码 Read More1var a = {} 2a.b = a; 3try{ 4 JSON.stringify(a) 5}catch(e){ 6 document.write(e); 7} - 前边有一篇关于 JavaScript 对象声明,可以作为是 JavaScript 模块化的一个铺垫。这里会涉及到两个话题模块的定义和引入,对于模块化的编程语言,我们可以用 include, require 或 import 那样的谓词来引入模块。回想下我们对于非模块化的 JavaScript 是怎么引入的,比如在 html 文件里 js 文件,用 <script src="some.js"></script>。如果是更动态一点就会用 document.createElement("script"), 再指定它的 src 属性为一个 js 文件,添加加到 DOM 中去的方式来加载 js 文件。
上面两种方式都不够优雅,我们现在想要实现为 require() 函数来引入 js 库的方式,所以 JavaScript 模块的规范就出现了 CommonJS 和 AMD(Asynchronous Module Definition) 两种。
1. CommonJS
CommonJS 中有一个全局的 require() 方法,它就是执行 require() 代码后马上使用模块提供的属性或方法,它假定执行完 require() 行后,模块即已就绪。例如加载一个 'math' 模块var math = require('math');
Read More
math.add(2, 3); - 最早的时候,我们只需要 GET 和 POST 方法,POST 方法的引入也只是为了消除 URL 过长,参数隐藏,上传文件的问题,完全和语义无关。接触到 RESTful 之后,我们开始思考 GET 和 POST 的不同语义,并且十分必要的去发掘出所有的 HTTP method,HTTP/1.1 所实现的 method,见 RFC 2616, 有这些:
OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
规范是这么定义的,这还要看容器实现了多少,比如 Tomcat 7 中的 servlet api 实现了
doOptions, doGet, doHead, doPost, doPut, doDelete, doTrace 就差个 doConnect 了。
而我们这里要说的 PATCH method 是在 Servlet 3.0 和当前 Tomcat 7 中都提到的,也就是尚未实现它。
这也难怪,PATCH 在 2010 年三月份才成为正式的方法,见 RFC 5789。没有 PATCH 的时候我们进行更新的操作采用的是 PUT 方法。那么 PATCH 和 PUT 有什么区别呢?
同样可以从语义上去理解,有两方面的对比: Read More