前面一篇 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 - 在 Apache 应用的目录中有 .htaccess 文件来进行重定向,目的是实现省略扩展名 .php 来访问相应的 php 文件,例如用 url
http://localhost/unmi/forgotPassword 来访问 http://localhost/unmi/forgotPassword.php
.htaccess 文件的内容是:RewriteEngine on
结果访问 http://localhost/unmi/forgotPassword 时出现错误:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php
实际上文件 /data/unmi/forgotPassword.php 是存在的。这就奇怪了,怀疑过是文件权限的问题(Mac 平台),改成 755 也不行。也经为是 AllowOverride 的问题,可它的值我设置成了 All 啊,又不是 None,应该不是症结所在。Not Found
The requested URL /data/unmi/forgotPassword.php was not found on this server.
费了一番功夫也明白了我是配置了别名来访问应用的,在 Apache httpd.conf 中是这样定义的别名: Read More - 对象,类,模块的概念可以让系统更清晰,亦能增强代码的重用性。目前 JavaScript 规范本身并不支持类或模块,正在制定中的 ECMAScript 6th Edition 将会纳入类,模块的概念,不过不知会是何年马月的事,毕竟这不能像 JDK 升级那么干脆。
还有种办法来写模块化的 JavaScript 就是使用微软的 TypeScript 或是 Google 的 Dart,它们是面向对象的编程语言, 能直接编译成兼容的 JavaScript 代码,有条件的可以去尝试。
回到现实来,就现有的 JavaScript 规范怎么去模块化。众所周知,JavaScript 中函数是第一等公民,所以我们早先是这样使用函数来声明对象的:
1. 原始写法(比直接调用函数显得高级些):1function Module(){ 2 this.count = 10; 3 this.foo = function(x){ 4 return x+1; 5 } 6} 7 8var m1 = new Module(); 9console.log(m1.count); 10console.log(m1.foo(3));
Read More