闪耀暖暖 耗材计算器 rxjs + angular2+
What
闪耀暖暖的设计师 材料耗材计算器
基于一个已经有的原生js 进行改造
原来生 http://www.spongem.com/ajglz/tools/evalLevelUpCost.html
重构内容
- 首先把这个的源码 搞下来,比较无脑的操作
- 然后开个module 配一下routing
- 搞个component 然后把函数数据都搬进来
- 把相关全局变量 改为
this.
- 修改原来的一些
$
方法 改为原生js,或者改为[(ngModel)]
双向绑定,至此基本可以运行。 - 解构一下用户输入和计算输出分别叫做
Class: CardBasic/Card -> html:Card/CardOut
// 好吧 这里变量名有点乱 现在看来 - 引入
https://material.angular.io
的组件,稍微调整画风 - 尝试搞一个computed,移除计算按钮, 改为
get XXX
的方法
这里遇到问题, 根据调试,页面上的调用会反复调用get方法, 大量重复不必要计算
- 解决方案1: 引入Ramda,建立两个cache 分别是计算结果 和 用户输入,用 Ramda的深比较和深拷贝完成少的计算次数
写着还好,行数不多,就能实现,性能也好,但是问题是,相当于你依然要去关心的是,输出值输入值直接的具体关系才能写。
- 解决方案2: 引入rxjs,用Observable搞
这里实践上有些问题
- 双向绑定如何和
BehaviorSubject
绑定,最后用(ngModelChange)
来 单向到 具体字段 - 能否监听整个Class
1 | import { of } from 'rxjs'; |
例如这样 并不会因为修改了a的子字段而自动发送next
搞了半天最后还是 感觉很 手工写依赖的输入
这一块的实现主要如下
1 | // 相当于所有用户输入的部分 都会对应一个emitter |
- 最后增加了一点 try catch,因为 不同的卡可选范围并不同,或者用户输入不合法会 爆红=.=只在 两个LevelVal里加了
最后结果
https://cromarmot.github.io/Debuq/#/nikki4/lvlup
如果打开看到404,保持页面,等待一会儿再刷新即可。因为有worker service
TODO
比如搞成动态拉取
计算函数再向纯函数靠拢啊
怎么json 转换 Class 甚至 Map // 搜了一会没搜到简洁的方案
更好的双向绑定+BehaviorSubject 绑定?
是否可能简化某部分代码
输入控制 比如 现在其实可以输入 小数 和 范围以外的数
比如因为还是有不少json 导致 typescript的 类型判断并不完整 虽然