Javascript Visjs动态更新时间线项目

Javascript Visjs动态更新时间线项目,javascript,vis.js,vis.js-timeline,Javascript,Vis.js,Vis.js Timeline,我正在使用,我正在尝试从当前时间扩展一个项目,持续时间为2天 var items = new vis.DataSet([{ id = 0, start = moment(new Date()), end = moment(new Date()).add(2, 'days') }, /* And maybe more items */]); 创建新的时间线时: var container = document.getElementById('container'); var time

我正在使用,我正在尝试从当前时间扩展一个项目,持续时间为2天

var items = new vis.DataSet([{
  id = 0,
  start = moment(new Date()),
  end = moment(new Date()).add(2, 'days')
}, /* And maybe more items */]);
创建新的时间线时:

var container = document.getElementById('container');
var timeline = new vis.Timeline(container, items, null);
现在我想更新我的一个项目(比如,第一个),这样它总是从当前时间开始。我认为
currentTimeTick
将是一个更新的好地方:

timeline.on('currentTimeTick', function() {
  var itemData = timeline.itemSet.items[0].data;
  itemData.start = moment();   // Set the start to current time
  timeline.itemSet.items[0].setData(itemData);
}
当我在Chrome中调试时,我看到项目集中的开始时间发生了变化,但我不确定为什么UI没有更新以反映这种变化(我希望项目的开始时间与我当前的时间相匹配)


我浏览了源代码,在我看来,
setData
应该会导致时间轴上的
重画,但我认为这不会发生。当我拖动时间线时,它会导致重新绘制,并且相应地调整项目的大小。我需要做些什么来强制重新绘制这里的时间线吗

timeline.redraw();

尽管调用
timeline.redraw()
是一个选项,但它会导致重新绘制整个时间线,这是非常昂贵的

在其
原型中有一种方法,它显然调整了单个项目的水平位置,因此我所做的是在设置数据后调用此位置:

timeline.itemSet.items[0].setData(itemData);
timeline.itemSet.items[0].repositionX();
编辑: 正如@madebydavid所建议的,我们可以用这一行替换上面的两行,而不是直接调用
respositionx
setData

timeline.itemsData.update(itemData);

感谢@madebydavid

基于版本7.4.2,而不是
索引,即[0]…
,项目
id
工作:

// Get element from event
let element = e.target;

// Get item data
let itemData = prevTimeline.itemSet.items[element.id].data;

// Set end time based on the start time and duration
itemData.end = moment(itemData.start).add(moment(itemData.duration, 'HH:mm:ss').seconds(), 's');

// Update timeline data (auto refreshes)
prevTimeline.itemsData.update(itemData);

谢谢你的回复。实际上,
redraw
函数会导致重新绘制整个时间线,这是非常昂贵的。最后,我对项目本身使用了
respositionX
,我认为如果调用
vis.DataSet
上的
update
方法,它将自动触发重画<代码>timeline.itemSet.update(itemData)。您不需要这样调用
setData
respositionx
。谢谢您提供的信息。我将尝试它,看看它是否具有相同的行为或尝试过它,但它给出了一个错误:
timeline.itemSet.update
不起作用是的,抱歉-我通常直接操作数据集,而不是通过时间线。我认为正确的调用函数应该是
timeline.itemsData.update()
很抱歉回复太晚,但是我认为这里的
update
函数需要一些参数。我不确定我需要传递给它什么。