[英]Implementing a selectable list of items in Meteor 0.8.0 (Blaze)
假设我们想要实现一个可选择的项目列表,其中单击列表中的某些内容会通过向其添加selected
类并从列表中的任何其他内容中删除此类来突出显示该项目。 Meteor 0.8为我们提供了两种同样可行的方法:
<template name="dataItem">
<li class="data-cell {{selected}}">
{{> dataStuff}}
</li>
</template>
使用以下代码:
Template.dataItem.events =
"click .data-cell": (e) ->
Session.set("selectedTweet", @_id)
Template.dataItem.selected = ->
if Session.equals("selectedTweet", @_id) then "selected" else ""
在Meteor 0.8之前,这种方法很糟糕,因为选择/取消选择导致整个元素的重新渲染,使得任何DOM操作都被重置。
<template name="dataItem">
<li class="data-cell">
{{> dataStuff}}
</li>
</template>
用代码:
Template.dataItem.events =
"click .data-cell": (e, t) ->
$(".data-cell").removeClass("selected")
t.$(".data-cell").addClass("selected")
在流星0.8之前,此操作基本上是完全不可能的。
如果您正在实施这样的列表,您会选择什么? 有没有更好的方法呢?
解决此问题的另一种方法是不存储一个会话变量来考虑所选项目,而是存储列表中所有项目的选择状态,每个项目都在一个单独的Session
变量中。 这样的事情,假设你在allIds
列出了所有_id
:
allIds = ...
Template.dataItem.events =
"click .data-cell": (e) ->
allIds.forEach((id) -> Session.set("#{id}-selected", ""))
Session.set("#{@_id}-selected", "selected")
Template.dataItem.selected = ->
Session.get("#{@_id}-selected")
当然,这假设具有相同值的Session.set
不会使反应计算无效; 我不确定的东西。 如果是这种情况,那么我想在设置之前可以检查该值。 对这个解决方案并不满意,但这是解决问题的另一种方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.