thinkjs-behavior-ejs
====================

> 这是一个[ThinkJS](http://www.thinkjs.org)的插件，实现EJS模版的前后台共享。在ThinkJS项目中引入此插件，只需在后台声明一次EJS模版，前台就能复用模版，无需再到前台重新声明。

使用方法
--------

### 1、引入Behavior

**注意!** thinkjs v1.1.x 及以上版本需要在`App/Conf/common.js`中前置引入`thinkjs-behavior-ejs`，如下：
```
// 这个引入必须前置在定义 ejs filter 之前声明
thinkRequire('thinkjs-behavior-ejs');
```


在`App/Conf/tag.js`中写入代码：

```
var ejsBehavior = thinkRequire('thinkjs-behavior-ejs');
module.exports = {
    view_parse: [false, function(http, data) { return ejsBehavior(http).run(data); }]
};
```

参考：[ThinkJS Behavior](http://www.thinkjs.org/doc/arch.html#行为behavior)

### 2、声明需要共享模版的action

在`App/Conf/config.js`写入配置：

```
ejs_behavior_actions: ['home/index/list']
```

**提示**：action需要写完整路径，不能写缩写，比如配置了route的缩写。

### 3、创建模版目录

在对应的`App/View/[Group目录]`下创建文件夹`tpl`。比如上面写的`home/index/list`，就是在`App/View/Home`目录下创建`tpl`文件夹。

### 4、创建共享模版

在`tpl`文件夹下创建模版，命名格式：`[controller]_[action]_[自定义名称].html`。

例如：index_list_paging.html，前面`index_list`与View的模版命名相同，后缀不一定是`.html`，而是`config.js`中定义的`tpl_file_suffix`。参考：[ThinkJS 默认配置](http://www.thinkjs.org/doc/appendix.html#默认配置)

### 5、后台View引用共享模版

在View中，直接使用`include`引入共享模版。

```
<% include tpl/index_list_paging.html %>
```

### 6、将共享模版输出给前台

在View的页面底部，找一个合适的位置，写入代码：

```
<script src="/resource/lib/ejs-0.8.6/ejs.min.js"></script>
<%- _ejs_templates %>
```

**提示**：`_ejs_templates`不能使用`=`输出，使用`=`会被转义。

### 7、在前台使用模版

在第6步中，`_ejs_templates`会向页面输出模版代码，并为每个模版重新分配一个id，id格式为：`_ejs_tpl_[controller]_[action]_[自定义名称]`，这个自定义名称就是第4步中提到的模版自定义名称。

那么，前台就能直接使用ejs接口调用模版，如下：

```
ejs.compile($('#_ejs_tpl_index_list_paging').html());
```

复杂应用
--------

### 共享filter

如果你在ThinkJS中需要使用EJS的filter特性，那么，你可以在`App/Common/common.js`中定义filter，比如：

```
// ejs 一定要通过 thinkRequire 引入，不要使用 require()
// 如果使用 require() 会导致 View 模版无法找到filter
var ejs = thinkRequire('ejs');

ejs.filters.getVersion = function(o) {
    return 'v' + o.version + '-' + moment(o.create_time).format('YYYYMMDD');
};
```

当这么定义`ejs.filters`之后，`thinkjs-behavior-ejs`会将你声明的`filter`一并输出到前台，提供给前台使用。

例子
----

参考：https://github.com/maxzhang/lavaflow
