# creator

creator 是用于构建页面的工具函数，可以让使用者只需集中精力于资源本身，无需关注页面的实现。

一个默认的约定：一个页面中可以有若干个资源，最重要的那个资源被称为主资源。

## 资源间的关系

其它资源与主资源有如下几种关系：

- nestedResource[]：嵌套于主资源内的资源列表。例如填写简历时，简历为主资源，其下的工作经历、技能、教育背景为嵌套资源。
- parallelResource[]：与主资源并列的资源。

嵌套只会有一级，更多级的嵌套基本意味着设计不合理，应从产品层面纠正为上面两类。对用户来说，过深的资源触及路径也是种负担。

## 接口设计

creator 对使用者来说只暴露一个函数，可以接受下面的几个 option：

- 主资源相关的字段由 ListViewFactory 处理
- nestedResource 的字段由 NestedListViewFactory 处理
- parallelResource 的字段由 ParallelListViewFactory 处理

然后由 creator 组合上面结果返回。

## 面向资源编程

最初我们习惯于面向 DOM 编程，关注点在 DOM 和 DOM 操作；UI 框架的流行使得我们可以摆脱 DOM，把关注点放在组件和组件背后的数据。

面向资源则是更高一级的抽象：它的关注点在页面要展示、操作的数据集种类，以及各个数据集之间的关系（从属还是并列），这种抽象对于中后台管理系统来说，更加面向具体业务。

面向资源的思想，对开发和使用 acribus 来说，都是必不可少的。

## 主函数使用示例

- 调用：`new ViewFactory(configs)`
- 返回：Vue config object

configs 的情况有四种：只有主资源、有主资源和嵌套资源、有主资源和平行资源、同时有主资源、嵌套资源和平行资源，下面将逐一说明。

### 只有主资源

```javascript
configs = configsMain = {
  // 页面的场景
  mode: MODE.EDIT_IN_TABLE,
  route: {
    // 默认值为 `view`
    key: '',
    // 默认值为
    // {
    //   detail: 'detail',
    //   edit: 'edit'
    // }
    map: {}
  }
  // 数据集的来源
  data: new CollectionDescriptor('role'),
  // 数据集的各个字段，详情请参见 Schema
  schema: [
    new Schema.Input('Role Name', 'name', true),
    new Schema.Datetime('Create Time', 'ctime', false, {
      editable: false
    })
  ],
  // 对单一数据的操作，详情请参见 Actions
  actions: ['edit'],
  // 页面级别的操作，详情请参见 Hooks
  hooks: [],
  // 对页面的一些其它配置
  options: {
    columnEditable: true
  }
}
```

### 有主资源和嵌套资源

```javascript
configs = configsNested = {
  ...configsMain,
  // 数组中元素与主资源格式相同，但有一些特殊限制，下面只列出与主资源格式不同的地方
  nestedResource: [{
    // 1. 子资源无法使用 EDIT_IN_NEW_PAGE（会失去页面状态）
    // 2. 主、子资源不能同时为 EDIT_IN_DIALOG（不能嵌套弹窗）
    mode: MODE.EDIT_IN_TABLE,
    route: {
      // 默认值为
      // {
      //   detail: '${resoureName}detail',
      //   edit: '${resoureName}edit'
      // }
      map: {}
    }
  }]
}
```

### 有主资源和平行资源

```javascript
configs = configsParallel = {
  ...configsMain,
  // 数组中元素与主资源格式相同，但有一些特殊限制，下面只列出与主资源格式不同的地方
  parallelResource: [{
    // 只能以弹窗形式，如需新页面，需将该资源置为主资源
    mode: MODE.EDIT_IN_DIALOG,
    route: {
      // 默认值为
      // {
      //   list: `${resoureName}`,
      //   detail: '${resoureName}detail',
      //   edit: '${resoureName}edit'
      // }
      map: {}
    }
  }]
}
```

### 有主资源、嵌套资源和平行资源

```javascript
configs = configsParallel = {
  ...configsMain,
  // 数组中元素与主资源格式相同，但有一些特殊限制，下面只列出与主资源格式不同的地方
  nestedResource: [/* 若干嵌套资源 */],
  parallelResource: [/* 若干平行资源 */]
}
```
