knockout.js中的队列计时器

时间:2018-01-04 09:03:21

标签: javascript knockout.js timer

为客户队列计时器实现敲除绑定的最简单方法是什么?我没有那么好的淘汰赛,我的搜索只发现倒计时器的问题。我不应该从哪里开始。自定义绑定?手动刷新?每个建议都表示赞赏。

我有一个包含我的客户模型的可观察数组,客户模型的一个属性是EnqueueTime,其中包含客户进入队列时的时间。我想显示客户在队列中花费的时间(EnqueueTime和当前时间之间的时间跨度)。

到目前为止,我只是展示了EnqueueTime的价值。这只是我目前使用的测试代码的片段,稍后它将获得一些合理的表单和数据:

this.Customers = ko.observableArray();    
var vm = {};
vm.CustomerNote = "Test";
vm.EnqueueTime = Date.now();
vm.Priority = true;
this.Customers.push(vm);

观点:

<div id="customerQueue" class="table-responsive">
        <table class="table table-striped">
            <thead>
                <tr>
                    <th></th>
                    <th>Note</th>
                    <th>Time in queue</th>
                </tr>
            </thead>
            <tbody data-bind="foreach: Customers">
                <tr data-bind="css: {danger: Priority}">
                    <td>
                        <span data-bind="visible: Priority" class="glyphicon glyphicon-warning-sign"></span>
                    </td>
                    <td data-bind="text: CustomerNote"></td>
                    <td data-bind="text: EnqueueTime"></td>
                </tr>
            </tbody>
        </table>
    </div>

1 个答案:

答案 0 :(得分:1)

如果一次只有一些活动对象,快速的解决方案就是使用计算的observable。但是,由于没有其他任何变化,您需要一个可以独立更新的外部可观察对象来刷新显示的值。

这是一个简单的例子:

var vm = { models: ko.observableArray() };

var trigger = ko.observable(null).extend({ notify: 'always'});

class Model {
  constructor(time) {
    this.EnqueueTime = time;
    this.Elapsed = ko.computed(() => {
        trigger(); // read observable to be able to update when it updates
      var date = new Date(null);
        date.setTime(new Date() - this.EnqueueTime);
      return date.toISOString().substr(11, 8);
    });
  }
}

vm.models.push(new Model(new Date()));
vm.models.push(new Model(new Date(2018, 1, 1)));

setInterval(() => trigger(null), 1000);

ko.applyBindings(vm);

小提琴:

https://jsfiddle.net/AlexPaven/vnk92gt7/

如果我能进一步提供帮助,请告诉我。