2015-01-04 61 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