D3.js 更改客户端数据转换meteor.js中的值
在我当前的meteor.js项目中,用户可以创建一个项目并向其中添加数据节点。我用D3来显示力图中的节点。单击图形中的特定节点时,侧面板中的相应文本必须高亮显示。为此,我需要跟踪选定的节点。但是,我不想在数据库中存储“selected”字段 我现在正在使用此数据转换添加选定字段- /lib/routes.jsD3.js 更改客户端数据转换meteor.js中的值,d3.js,meteor,D3.js,Meteor,在我当前的meteor.js项目中,用户可以创建一个项目并向其中添加数据节点。我用D3来显示力图中的节点。单击图形中的特定节点时,侧面板中的相应文本必须高亮显示。为此,我需要跟踪选定的节点。但是,我不想在数据库中存储“selected”字段 我现在正在使用此数据转换添加选定字段- /lib/routes.js Router.route('/project/:code', { name: 'projectPage', data: function() {
Router.route('/project/:code', {
name: 'projectPage',
data: function() {
return {
project: Projects.findOne({code : this.params.code}),
nodes: Nodes.find({project: this.params.code}, {transform: function (doc) {
doc.selected = false;
return doc;
}})
}
}
});
模板是/client/templates/projectPage.html
<template name="projectPage">
<div class="project-page page">
<h3>{{project.title}}</h3>
<p>{{project.summary}}</p>
<div class="work-area">
<div class="map-space">
{{> nodeDisplay nodes=nodes}}
</div>
<div class="type-space">
{{> typeDisplay nodes=nodes}}
</div>
</div>
</div>
</template>
<template name="nodeDisplay">
<div id="svgdiv"></div>
</template>
<template name="typeDisplay">
{{#each nodesData}}
<p>{{text}}</p>
<br/>
{{/each}}
</template>
但是,这会更新数据库以包含“选定”字段。
有没有更好的方法来保持反应性 meteor的方法是使用会话变量和助手函数 所以不是
Nodes.update(selected_id.toString(), {$set: {selected: true}});
使用
以及Template.typeDisplay.helpers中的accompnying助手
isNodeSelected: function() {
if(Session.get("selected_node") === this._id) {
return "selected"
}
}
在显示每个节点的模板中(此代码假定您希望通过应用类名“selected”在typeDisplay中选择相应的文本):
{{{#每个节点数据}
{{text}
{{/每个}}
Session.set("selected_node", this._id);
isNodeSelected: function() {
if(Session.get("selected_node") === this._id) {
return "selected"
}
}
<template name="typeDisplay">
{{#each nodesData}}
<p class="{{isNodeSelected}}">{{text}}</p>
<br/>
{{/each}}
</template>