避免更新本地客户端

Avoid updating of local client

我正在尝试使用 Polymer with Meteor, but there are some problems with elements that have a toggle state, for example the paper-checkbox,如果你使状态响应。

paper-checkbox 是普通复选框的高级版本。它在 checkedunchecked 两种状态之间交替。如果点击复选框,则会触发聚合物事件并切换状态。

当您使复选框状态具有反应性时,就会出现问题。您将在 Polymer 和 Meteor 之间获得竞争条件。 Polymer 只是将复选框状态切换到与当前状态相反的状态,而 Meteor 根据集合中的值设置元素状态。

因此,根据哪个项目赢得比赛,复选框被设置为正确状态或再次切换,因此显示为错误状态。 集合中的状态始终是正确的,但前端显示变得混乱。

这是我的模板代码:

<template name="task">
  <paper-checkbox class="toggle-checked" {{isChecked}}></paper-checkbox>
  <span class="text">{{text}}</span>
</template>

以及相应的事件和助手:

Template.task.events({
  "click .toggle-checked": function (e) {
    // Set the checked property to the opposite of its current value
    Meteor.call("setChecked", this._id, ! this.checked);
  }
});

Template.task.helpers({
  isChecked: function () {
    return this.checked ? 'checked' : 'unchecked'; 
  }
});

Meteor.methods({
  setChecked: function (taskId, setChecked) {
    var task = Tasks.findOne(taskId);
    Tasks.update(taskId, { $set: { checked: setChecked} });
  })
});

有没有办法防止 meteor 在 Task.update() 调用后更新本地客户端,但保持对其他客户端的反应?

尝试像这样更改您的事件处理程序:

Template.task.events({
  "change .toggle-checked": function (e) {
    var checked = e.currentTarget.checked;
    if (checked !== this.checked) {
      Meteor.call("setChecked", this._id, checked);
    }
  }
});