当前位置: 首页 > 知识库问答 >
问题:

Ajax完成之前的聚合物渲染元素

房时铭
2023-03-14

那些日子我一直在玩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元素刷新。如果有人能帮助我,那就太好了。

你可以在这里有用户界面:游乐场用户界面

共有3个答案

阎兴为
2023-03-14

好的,非常感谢弗拉维奥和甘特!

我终于明白了,但是我添加了一些信息来稍微调整您的信息,因为我正在处理一个大的结果集,而不仅仅是一个对象。

有关信息,请参阅相关代码部分:

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
                        });
                    }
                }
            });
        });
    }
});

聚合物创建正确数量的子节点,但为空。如果它创建了节点,它应该能够拥有所需的信息,这些信息是由循环在推送()调用期间提供的。

以下是结果页面:

再次感谢你!

鲍飞星
2023-03-14

为什么要使用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"}
                       ]
               */
            }
        });
      }); 
    },
});
祁通
2023-03-14

您的元素只有属性公民身份,但您绑定到合作伙伴。如果要绑定数据,必须创建适当的属性。为了让Polymer注意到属性值的变化,您还需要使用Polymer API来更新值,例如set()这个。notifyPath(),。。。

 类似资料:
  • 操作步骤: ①在"图层管理"模块,选择一个带有数据的标注图层,点击"样式设置"。 ②选择散点、分类、排序显示的标注图层,若标注密集,建议开启聚合显示,开启是否聚合显示按钮。 ③点击"应用"后。 提示: ●聚合显示将一定范围内相邻的标注聚合成簇状显示,并在聚合的标注上显示其聚合的个数。聚合后地图的展现效果更清晰,显示速度也会更为流畅。 操作动图: [查看原图]

  • 我试图在某一元素条件下隐藏几个聚合物元素。我知道有几种可能性。在我的opinon中,最简单的方法是引入一个新的CSS类 并将其添加到聚合物元素的类列表中 但这对元素没有影响。元素仍然可见。对elment检查器的查看显示,添加了该类: 其中parent-elem是父元素的名称。 谁能解释一下为什么元素不会被隐藏? 谢谢。 问候你,梅森曼

  • 我有一个带有对象数组的组件,其中我正在根据字符串进行过滤。问题是当我尝试将此过滤器的返回设置为本地状态时,它会抛出错误,我不太理解原因。 所以,因为我希望这个数组处于我的状态,所以我决定这样做: 插入这一行后发生的事情是这样的: 它开始多次渲染。我假设,每次状态改变时,它都会重新渲染组件(如果我错了,请纠正我)。不过,我不知道它为什么要多次这样做。 因此,我想过使用 useEffect 来实现此处

  • 问题内容: 我创建了以下聚合物元素: 我这样做是在我的index.html中调用此方法: 我期望对于todo数组中返回的每个对象,都会打印出一个。但是,当我运行该应用程序时,我在控制台中得到以下输出: 未捕获的TypeError:无法读取未定义的属性“ todos” 在 我不确定这里发生了什么以及如何引用从ajax响应接收回的数据。 问题答案: 将头撞在墙上几个小时后,我设法解决了这个问题。我创建

  • 问题内容: 我建立了一个复合组件,看起来像这样: 组件正确显示当前标签。 现在,当执行该动作时,什么也不会发生。但是,当我将Postfix添加到组件中的ID时,它可以正常工作(请参见下文)。 并使用后缀在render中定义ID: 有人可以向我解释为什么仅当我在ID中添加后缀时才起作用吗? 问题答案: 这个问题实际上有两个方面。 第一个问题是,实际上指定复合部件的ID 本身 的。默认情况下,HTML

  • 我正在使用materialize autocomplete插件创建带有autocomplete的多个标记输入。插件工作良好,但仅用于作为预先定义的数组传递的数据。如果数据是从ajax调用传递的,则插件不会显示带有选项的下拉列表,就好像没有结果一样。有结果事实上,他们被缓存(使用缓存选项),并显示为下拉只有在重新键入搜索短语。 总而言之,autocomplete插件不会等待ajax完成其请求并交付数