我终于在学习 D3 的过程中,偶然发现了一个我无法找到答案的问题。我不确定我的问题是因为我没有按照图书馆的惯用方式思考,还是因为我目前不知道的程序。我还应该提一下,我在 6 月份才开始做与网络相关的事情,所以我对 javascript 还很陌生。
假设我们正在构建一个工具,为用户提供带有相应图像的食物列表。让我们添加额外的约束,即每个列表项都需要用唯一的 ID 标记,以便它可以链接到另一个 View 。我解决这个问题的第一直觉是创建一个列表 <div>每个都有自己的 ID,其中每个 div有自己的<p>和 <img> .生成的 HTML 看起来像:
<div id="chocolate">
<p>Chocolate Cookie</p>
<img src="chocolate.jpg" />
</div>
<div id="sugar">
<p>Sugar Cookie</p>
<img src="sugar.jpg" />
</div>
此工具的数据位于 JSON 数组中,其中单个 JSON 如下所示:
{ "label": "sugar", "text": "Sugar Cookie", "img": "sugar.jpg" }
有没有办法一次性生成 HTML?从添加 div 的基本情况开始,代码可能类似于:
d3.select(containerId).selectAll('div')
.data(food)
.enter().append('div')
.attr('id', function(d) { return d.label; });
现在,添加一个 <div> 怎么样?用<p>在里面?我最初的想法是做类似的事情:
d3.select(containerId).selectAll('div')
.data(food)
.enter().append('div')
.attr('id', function(d) { return d.label; })
.append('p').text('somethingHere');
但是,我看到了两个问题:(1) 你如何从 div 中获取数据?元素,以及 (2) 如何在一个声明链中将多个子元素附加到同一个父元素?我想不出一种方法来完成第三步,我将在 img 上附加.
我在另一篇文章中发现了嵌套选择,它指向 http://bost.ocks.org/mike/nest/ .但是嵌套选择,因此将追加分成三个 block ,是否适合/惯用这种情况?或者实际上是否有一种结构良好的方法可以在一个声明链中形成这种结构?似乎有一种方法可以在 https://github.com/mbostock/d3/wiki/Selections 中提到子选择,但我对语言不够熟悉,无法检验该假设。
从概念层面来看,这三个对象( div 、 p 和 img )更像是一个组而不是单独的实体,如果代码也能反射(reflect)这一点就好了。
最佳答案
您不能在一个链接命令中添加多个子元素。您需要将父选择保存在变量中。这应该做你想做的:
var data = [{ "label": "chocolate", "text": "Chocolate Cookie", "img": "chocolate.jpg" },
{ "label": "sugar", "text": "Sugar Cookie", "img": "sugar.jpg" }];
var diventer = d3.select("body").selectAll("div")
.data(data)
.enter().append("div")
.attr("id", function(d) { return d.label; });
diventer.append("p")
.text(function(d) { return d.text; });
diventer.append("img")
.attr("src", function(d) { return d.img; });
参见工作 fiddle :http://jsfiddle.net/UNjuP/
您想知道像 p 或 img 这样的子元素如何访问绑定(bind)到其父元素的数据。附加新元素时,数据会自动从父元素继承。这意味着 p 和 img 元素将与父 div 绑定(bind)相同的数据。
这种数据传播对于append 方法来说并不是唯一的。它发生在以下 selection 方法中:append , insert , 和 select .
例如,对于selection.append:
selection.append(name)
Appends a new element with the specified name as the last child of each element in the current selection. Returns a new selection containing the appended elements. Each new element inherits the data of the current elements, if any, in the same manner as select for subselections. The name must be specified as a constant, though in the future we might allow appending of existing elements or a function to generate the name dynamically.
如果有什么不清楚的地方,请随时询问细节。
编辑
您可以添加多个子元素,而无需使用 selection.each 方法将选择存储在变量中。然后,您还可以直接从父级访问数据:
var data = [{ "label": "chocolate", "text": "Chocolate Cookie", "img": "chocolate.jpg" },
{ "label": "sugar", "text": "Sugar Cookie", "img": "sugar.jpg" }];
d3.select("body").selectAll("div")
.data(data)
.enter().append("div")
.attr("id", function(d) { return d.label; })
.each(function(d) {
d3.select(this).append("p")
.text(d.text);
d3.select(this).append("img")
.attr("src", d.img);
});
关于javascript - D3、嵌套追加和数据流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13203897/
我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
下面例子中的Nested和Child有什么区别?是否只是同一事物的不同语法?classParentclassNested...endendclassChild 最佳答案 不,它们是不同的。嵌套:Computer之外的“Processor”类只能作为Computer::Processor访问。嵌套为内部类(namespace)提供上下文。对于ruby解释器Computer和Computer::Processor只是两个独立的类。classComputerclassProcessor#Tocreateanobjectforthisc
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的
我有一个名为posts的模型,它有很多附件。附件模型使用回形针。我制作了一个用于创建附件的独立模型,效果很好,这是此处说明的View(https://github.com/thoughtbot/paperclip):@attachment,:html=>{:multipart=>true}do|form|%>posts中的嵌套表单如下所示:prohibitedthispostfrombeingsaved:@attachment,:html=>{:multipart=>true}do|at_form|%>附件记录已创建,但它是空的。文件未上传。同时,帖子已成功创建...有什么想法吗?
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle
查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_