# Model

Model 用以创建一些范式的数据描述对象，在某个特定的场景下，这些对象拥有满足多数业务处理模式的预定义的 effects 和 reducers 

## Model.API

创建 ajax 发起 (fetch) --- 等待 --- 响应成功 (success) / 响应失败 (fail) 模式的数据描述对象

在 models/index.js 中如下定义：

```javascript
import {Model} from 'ola-toolkit';

export default () => ({
  asyncList: Model.API.takeLatest({
    url: '/user/list',
    method: 'GET',
  }),
});
```

则在组件中可以派发一个获取 user list 的请求:

```javascript
dispatch({
  subject: 'asyncList',
  act: 'list',
})
```

通过 `connect` 从 store 中取出数据 (以 immutable 为例)

```javascript
@connect(state => ({
  payload: state.getIn(['asyncList', 'payload']),
  loading: state.getIn(['asyncList', 'loading']),
  error: state.getIn(['asyncList', 'error']),
}))
```

## API

以下文档中的 `SagaHelpers` 即 Saga 辅助函数，主要有下面两种：

- takeEvery 获取每一个派发的行为

- takeLatest 获取最后一次派发的行为

### Model.API

- Model.API\[SagaHelpers\]\([Ajax RequestConfig](/docs/ola-toolkit/component/ajax)\)

  创建一个 API 调用类型的数据描述对象
  
  可派发 act:
  
| act | 说明 | payload |
| --- | --- | --- |
| fetch | 发起请求 | [Ajax RequestConfig](/docs/ola-toolkit/component/ajax) |
| success | 响应成功 (无需手动派发) | response |
| fail | 响应失败 (无需手动派发) | exception |
| update | 更新数据 | newPayload |
| clear | 清除数据 | - |
  
  数据节点:
  
| key | 说明 | 数据类型 |
| --- | --- | --- |
| loading | 是否处于请求中 | boolean |
| loaded | 是否加载完成 | boolean |
| error | 异常信息 | Immutable \| object |
| payload | 响应数据 | Immutable \| object |

#### retry

重试次数

`default`: 0

当请求失败时，将尝试进行 retry 次重试，直至 API 流程 resolve (act: success)

```javascript
serviceList: Model.API.takeLatest({
  url: '/api/service/list',
  retry: 3
})
```

#### urlVars

url 路径变量替换

当需要使用动态路径时，可以在 `url` 配置项中使用 `:var` 占位符:

```javascript
serviceList: Model.API.takeLatest({
  url: '/api/service/:id',
  params: {}
})
```

在 dispatch 时，通过 urlVars 对 url 中的变量进行配置:

```javascript
this.props.dispatch({
  subject: 'serviceList',
  act: 'fetch',
  urlVars: {
    id: 3,  // url: /api/service/3
  }
});
```
  
### Model.Helper

- createBasicApiReducer()
  
  创建 API 调用类型的 reducers

- initialApiState 

  API 调用类型 reducers 的初始值

