# To B Web for TV Platform

## 1. 项目结构简述
- component目录用来存放UI组件相关代码
- util/API目录用来存在API请求相关代码
- util目录用来存放其他工具类
- 其他的照旧

## 2.代码规范简述(待补充)
- 类型命名,驼峰式命名,component内相关类型建议首字母大写,其他的根据情况可以首字母小写
- 变量命名,驼峰式命名
- JSON变量命名,全小写,下划线风格单词
- html中如无特殊情况class用来写样式,id用来js操作
- class命名字母小写,中划线风格(CSS中无法识别大小写)
- CSS书写顺序推荐:只遵循横向顺序即可,先显示定位布局类属性,后盒模型等自身属性,最后是文本类及修饰类属性
- 公共样式在mixins.less文件中,后续如再有公共样式再补充

| 显示属性    |  自身属性  | 文本类及修饰类属性 |
| --------   | --------  | --------          |
| display    | width     | font              |
| visibility | height    | text-align        |
| position   | margin    | text-decoration   |
| float      | padding   | vertical-align    |
| clear      | border    | white-space       |
| list-style | overflow  | color             |
| top        | min-width | background        |

### 附:
### API Mock方法
- 添加Mock API的返回数据json文件在 src/lib/mockapi/ 目录下如 src/lib/mockapi/test1.json
- util/API/APIClient.js中增加访问方法,比如:

```
static getMockData(callback){
    let apiUrl = AJAXHelper.genMockDataUrl('test1');
    AJAXHelper.get(apiUrl,callback);
}
```

- sence中引用APIClient

```
import APIClient from '../../../util/API/APIClient'
```

- scene业务程序中使用:

```
APIClient.getMockData((isTrue,res)=>{
    console.log(res);
});
```

### EFMarquee使用说明:
- 类型导入

```
import Marquee from '../../../component/EFMarquee.js'
```
- 代码中使用

```
this.marquee = Marquee.getInstance();
this.marquee.create(document.getElementById('title_marquee'),100);
this.marquee.setStr(document.getElementById('title_marquee').innerHTML);
this.marquee.start(true);
```

- 停止跑马灯

```
this.marquee.stop();
```


### ScrollEventPlugin使用说明:

>     针对阿里小程序Scroll控件定制的补充事件的插件类。
>     阿里小程序要求Scroll控件内必须有一个class为scroll-list的元素,这里我们的插件对scroll-list也有一定要求,
>     scroll-list相对于父级元素不要有高度的padding或margin的情况,否则会导致滚动计算不准确导致无法命中事件的情况

- 类型导入


```
import ScrollEventPlugin from '../../../util/ScrollEventPlugin'
```
- 代码中使用
    
```
//创建插件对象
this.rightScrollEvent = new ScrollEventPlugin();
//绑定目标Scroll widget
this.rightScrollEvent.bind(this.moye.root.getWidgetById('cl-right-content-scroll'));
//设置回调触发事件
this.rightScrollEvent.onScrollToBottom(()=>{
    console.log('on scroll to bottom');
});
//释放事件锁
this.rightScrollEvent.releaseEventLock();
```
>     本插件在触发“到底”或者“到顶”事件时,为了防止非自愿的再次触发,所以在触发事件之后,插件内部会加锁防止再次触发,
>     直到调用方完成了触发后的相关任务之后,认为可以再次处理触发事件时,可手工解锁。

### NotificationCenter使用说明

>     专门为moye框架下应用程序实现的全局观察者模式的消息中心,方便跨Scene的消息传递,局部状态变更。
>     使用时需要在Scene下引用NotificationCenter类

- 类型导入


```
import NotificationCenter from '../../../util/NotificationCenter';
```

- 注册观察者


```
// name:观察者名称
// selector:为观察者绑定的消息回调
static add(name, selector)
```

```
//调用示例
NotificationCenter.add('collection_refresh', this.collectionGlobalListener.bind(this));
```



>  同一个name可以依次绑定多个消息回调,可以在不同scene中为同一个name绑定消息回调


- 向已注册的观察者发送消息


```
// name:观察者名称
// obj:需要通过消息中心发送的数据对象(非必要参数)
static call(name, obj)
```

```
//调用示例
NotificationCenter.call('collection_refresh');
```

- 删除观察者

>  当观察者所在scene被destroy时,观察者也会失效,这时我们建议手动移除之前注册过的观察者

```
// name:观察者名称
// selector:之前注册的观察者,消息中心会通过比对找到之前注册过的同名观察者,然后移除
static remove(name, selector)
```

>  selector参数如果缺省,则删除该name下所有的观察者

```
//调用示例
NotificationCenter.remove('collection_refresh', this.collectionGlobalListener.bind(this));
```