2015-01-04 58 views
0

我正在尝试将Polymer与Meteor结合使用,但是如果您使状态成为被动状态,那么存在切换状态的元素会出现一些问题,例如paper-checkbox避免更新本地客户端

纸张复选框是常规复选框的发烧友版本。它在两种状态之间交替检查未检查。如果点击该复选框,聚合物事件将触发并切换状态。

当您使复选框处于被动状态时,会出现问题。你会得到Polymer和Meteor之间的竞争条件。聚合物只是将复选框状态切换到当前状态的相反方向,而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} }); 
    }) 
}); 

是否有办法防止Task.update后更新本地客户端的流星()打电话,但要保持对其他客户的反应能力?

回答

2

试着改变你的事件处理程序是这样的:

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

你,当恰克'click'到'change' - 这个解决同样的问题,在我的项目。谢谢!我也使用'fastclick'软件包。 – qnub 2015-01-23 10:12:34