那些日子我一直在玩polymer,只是为了测试一些关于AJAX调用等的可能性。
由于聚合物的性质,由于DOM/AJAX竞争条件,我面临一些奇怪的行为。
事实上,我有一个自定义元素,它使用ajax调用来检索针对远程服务的信息(JSON)。
以下是组件:
组件模板合作伙伴。html
<link rel="stylesheet" href="partners.css" />
<dom-module id="playground-partners">
<template>
<template is="dom-repeat" items="{{partners}}">
<section class="partner">
<img src="{{item.logo}}" alt="partners logo placeholder"/>
<section class="punshline">{{item.punshline}}</section>
</section>
</template>
</template>
<script async type="text/javascript" src="partners.js"></script>
下面是组件功能。js
Polymer({
is: "playground-partners",
properties: {
citizenship: {
type: String
}
},
attached: function(){
$.ajax({
context: this,
url: "http://api.randomuser.me/?results=4&nat="+this.citizenship,
dataType: 'json',
success: function(data){
this.partners = [];
for (var i = 0, len = data.results.length; i < len; i++) {
this.partners.push({
logo: data.results[i].user.picture.thumbnail,
punshline: data.results[i].user.name.first + " " + data.results[i].user.name.last
});
console.log(data.results[i].user.name.first);
console.log(this.partners[i]);
}
console.log(this.partners.length);
}
});
}
});
我不知道为什么,但如果我只使用1个结果元素,元素正确渲染和刷新尽快得到响应,但是如果我收到两个或更多的对象,它渲染元素与正确的模板量(这表明它发现Partners
数组具有预期的元素,这由控制台输出确认)。
我不知道如何在polymer上请求DOM元素刷新。如果有人能帮助我,那就太好了。
你可以在这里有用户界面:游乐场用户界面
好的,非常感谢弗拉维奥和甘特!
我终于明白了,但是我添加了一些信息来稍微调整您的信息,因为我正在处理一个大的结果集,而不仅仅是一个对象。
有关信息,请参阅相关代码部分:
attached: function(){
this.async( function(){
$.ajax({
context: this,
url: this.url+this.citizenship,
dataType: 'json',
success: function(data){
sanitizedData = []
for (var i = 0, len = data.results.length; i < len; i++) {
sanitizedData.push({
logo: data.results[i].user.picture.thumbnail,
punshline: data.results[i].user.name.first + " " + data.results[i].user.name.last
});
console.log(sanitizedData);
}
this.set("partners", sanitizedData);
}
});
});
}
});
如您所见,我必须使用一个中间数组才能在空的partners数组中插入整个for循环结果。
如果没有这个技巧,只会设置一个对象。
我真正不明白的是,为什么我使用此代码:
Polymer({
is: "playground-partners",
properties: {
url: {
type: String
},
citizenship: {
type: String
}
},
attached: function(){
console.log(this.partners);
this.async( function(){
$.ajax({
context: this,
url: this.url+this.citizenship,
dataType: 'json',
success: function(data){
this.partners = []
for (var i = 0, len = data.results.length; i < len; i++) {
this.partners.push({
logo: data.results[i].user.picture.thumbnail,
punshline: data.results[i].user.name.first + " " + data.results[i].user.name.last
});
}
}
});
});
}
});
聚合物创建正确数量的子节点,但为空。如果它创建了节点,它应该能够拥有所需的信息,这些信息是由循环在推送()调用期间提供的。
以下是结果页面:
再次感谢你!
为什么要使用JQuery来实现这一点?您应该使用ironajax
元素来执行ajax的调用。在这里你可以找到关于它的文档
无论如何,我认为您必须异步执行ajax调用,如下所示:
attached: function(){
this.async(function(){
//ajax call here
},someTimeIfNeeded);
}
因此,当您得到ajax调用的答案时,应该使用this。设置('pathOfObject',value)
以通知数组或对象更改。
使用you元素,我认为您必须执行以下操作:
Polymer({
is: "playground-partners",
properties: {
citizenship: {
type: String
},
partners:{
type: Array,
value: function(){return [];}
},
},
attached: function(){
this.async(function(){
$.ajax({
context: this,
url: "http://api.randomuser.me/?results=4&nat="+this.citizenship,
dataType: 'json',
success: function(data){
this.set("partners", data.results);
/* I think that your object should be something like this
data:[{logo:"logoUrl", pushLineData:"pushLineData"},
{logo:"logoUrl2", pushLineData:"pushLineData2"}
]
*/
}
});
});
},
});
您的元素只有属性公民身份
,但您绑定到合作伙伴。如果要绑定数据,必须创建适当的属性。为了让Polymer注意到属性值的变化,您还需要使用Polymer API来更新值,例如。set()
,这个。notifyPath()
,。。。
操作步骤: ①在"图层管理"模块,选择一个带有数据的标注图层,点击"样式设置"。 ②选择散点、分类、排序显示的标注图层,若标注密集,建议开启聚合显示,开启是否聚合显示按钮。 ③点击"应用"后。 提示: ●聚合显示将一定范围内相邻的标注聚合成簇状显示,并在聚合的标注上显示其聚合的个数。聚合后地图的展现效果更清晰,显示速度也会更为流畅。 操作动图: [查看原图]
我试图在某一元素条件下隐藏几个聚合物元素。我知道有几种可能性。在我的opinon中,最简单的方法是引入一个新的CSS类 并将其添加到聚合物元素的类列表中 但这对元素没有影响。元素仍然可见。对elment检查器的查看显示,添加了该类: 其中parent-elem是父元素的名称。 谁能解释一下为什么元素不会被隐藏? 谢谢。 问候你,梅森曼
我有一个带有对象数组的组件,其中我正在根据字符串进行过滤。问题是当我尝试将此过滤器的返回设置为本地状态时,它会抛出错误,我不太理解原因。 所以,因为我希望这个数组处于我的状态,所以我决定这样做: 插入这一行后发生的事情是这样的: 它开始多次渲染。我假设,每次状态改变时,它都会重新渲染组件(如果我错了,请纠正我)。不过,我不知道它为什么要多次这样做。 因此,我想过使用 useEffect 来实现此处
问题内容: 我创建了以下聚合物元素: 我这样做是在我的index.html中调用此方法: 我期望对于todo数组中返回的每个对象,都会打印出一个。但是,当我运行该应用程序时,我在控制台中得到以下输出: 未捕获的TypeError:无法读取未定义的属性“ todos” 在 我不确定这里发生了什么以及如何引用从ajax响应接收回的数据。 问题答案: 将头撞在墙上几个小时后,我设法解决了这个问题。我创建
我正在使用materialize autocomplete插件创建带有autocomplete的多个标记输入。插件工作良好,但仅用于作为预先定义的数组传递的数据。如果数据是从ajax调用传递的,则插件不会显示带有选项的下拉列表,就好像没有结果一样。有结果事实上,他们被缓存(使用缓存选项),并显示为下拉只有在重新键入搜索短语。 总而言之,autocomplete插件不会等待ajax完成其请求并交付数
问题内容: 我建立了一个复合组件,看起来像这样: 组件正确显示当前标签。 现在,当执行该动作时,什么也不会发生。但是,当我将Postfix添加到组件中的ID时,它可以正常工作(请参见下文)。 并使用后缀在render中定义ID: 有人可以向我解释为什么仅当我在ID中添加后缀时才起作用吗? 问题答案: 这个问题实际上有两个方面。 第一个问题是,实际上指定复合部件的ID 本身 的。默认情况下,HTML