考虑必要的内容部件数据结构如下:
{ id: '数据标识', categoryId: '所属分类标识', title: '名称', content: '内容', start: '开始日期时间' end: '结束日期时间' bgColor: '展示的背景色' }
由于上面在内容区域是直接按照分类作为绘制的,因此拿到数据后,对应的分类就已经存在了。重点要根据指定的开始和结束时间计算出开始和结束位置。
考虑如下:
- 考虑响应式,位置计算按照百分比计算
- 一周的总时间是固定的,开始日期时间和这周开始日期时间的差额占总时间的百分比即开始位置的百分比
- 结束日期时间和开始时间的差额占总时间的百分比即为结束时间距离最左侧的百分比
- 注意处理开始和结束时间溢出本周的情况
因此关于位置计算可以用如下代码处理:
{ // 日期时间分隔符 默认为空 对应格式为 '2017-11-11 20:00' // 对于'2017-11-11T20:00' 这样的格式务必指定正确的日期和时间之间的分隔符T _dateTimeSplit:' ', // 一周分钟数 _WEEKMINUTES: 7 * 24 * 60, // 一周秒数 _WEEKSECONDS: 7 * 24 * 3600, // 一天的分钟数秒数 _DAYMINUTES: 24 * 60, _DAYSCONDS: 24 * 3600, // 计算位置的精度 取值second 或 minute posUnit: 'second', // 计算指定日期的分钟或秒数 _getNumByUnits: function (dateStr) { var temp = dateStr.split(this._dateTimeSplit), date = temp[0]; // 处理左侧溢出 if (this._startDate.isAfter(date, 'day')) { // 指定日期在开始日期之前 return 0; } // 右侧溢出直接算作第7天即可 var times = (temp[1] || '').split(':'), days = (function (startDate) { var currDate = startDate.clone(), i = 0, d = moment(date, 'YYYY-MM-DD'); while (i < 7) { if (currDate.isSame(d, 'day')) { return i; } else { currDate.add(1, 'day'); ++i; } } console && console.error && console.error('计算天数时出错!'); return i; }(this._startDate)), hours = parseInt(times[0], 10) || 0, minutes = parseInt(times[1], 10) || 0, seconds = parseInt(times[2], 10) || 0, // 对应分钟数 result = days * this._DAYMINUTES + hours * 60 + minutes; return this.posUnit == 'minute' ? result : (result * 60 + seconds); }, // 计算日期时间的百分比位置 _getPos: function (dateStr) { var p = this._getNumByUnits(dateStr) / (this.posUnit == 'minute' ? this._WEEKMINUTES : this._WEEKSECONDS); return p > 1 ? 1 : p; } }
上面就拿到了一个数据所对应的开始位置和结束位置。基本上是已经完成了,但是还需要再处理一个情况:相同分类下的时间冲突问题。
考虑以如下方式进行:
- 没添加一个就记录下其数据
- 新增的如果和当前分类下已有的存在时间重叠,则认为冲突。