使用 Polymer 的 core-ajax 加载所有 json 文件后执行方法

Execute method after all json files are loaded using Polymer's core-ajax

我需要在加载所有 json 个文件后执行方法 callMe()。 我正在使用 Polymer 的 core-ajax 加载 json 文件。 我的代码:

<polymer-element name="my-schedule" attributes="speakersUrl sessionsUrl scheduleUrl">
    <template>
        <core-ajax auto url="{{scheduleUrl}}" handleAs="json" on-core-response="{{scheduleResponse}}"></core-ajax>
        <core-ajax auto url="{{sessionsUrl}}" handleAs="json" on-core-response="{{sessionsResponse}}"></core-ajax>
        <core-ajax auto url="{{speakersUrl}}" handleAs="json" on-core-response="{{speakersResponse}}"></core-ajax>
            </template>
        </div>
    </template>
    <script>
    (function() {
        Polymer('my-schedule', {
            speakersUrl: '../../data/speakers.json',
            sessionsUrl: '../../data/sessions.json',
            scheduleUrl: '../../data/schedule.json',
            speakersResponse: function(event, response) {
                this.speakers = response.response;
            },
            sessionsResponse: function(event, response) {
                this.sessions = response.response;
            },
            scheduleResponse: function(event, response) {
                this.schedule = response.response;
            },
            callMe: function() {
                console.log('I was called after all json files loaded');
            }
        });
    })();
    </script>

谁能帮我解决这个问题? 注:否jQuery。

有两种方法:

  1. 检查数据何时准备好->调用custom_element,其中在ready()回调中调用了callMe()

      <my-template if="{{data_json.list}}">
           <my-custom_element
              pass_data ='{{data_json.list}}'
           ></my-custom_element></template>
    

相似:Polymer, how to wait for core-ajax to finish before rendering other elements?

  1. 另一种是在scheduleResponse()中调用callMe();

我想我在这里要做的是制作 3 个 true / false 变量,并在每次加载后将加载项的状态设置为 true 并检查其他项的状态。为了防止它触发更多,一旦你可以使用 1 个变量来检查方法是否已经 运行.

示例

  <polymer-element name="my-schedule" attributes="speakersUrl sessionsUrl scheduleUrl">
    <template>
        <core-ajax auto url="{{scheduleUrl}}" handleAs="json" on-core-response="{{scheduleResponse}}"></core-ajax>
        <core-ajax auto url="{{sessionsUrl}}" handleAs="json" on-core-response="{{sessionsResponse}}"></core-ajax>
        <core-ajax auto url="{{speakersUrl}}" handleAs="json" on-core-response="{{speakersResponse}}"></core-ajax>
    </template>
    <script>
    (function() {
        Polymer('my-schedule', {
            speakersUrl: '../../data/speakers.json',
            speakerStatus: false,
            sessionsUrl: '../../data/sessions.json',
            sessionStatus: false,
            scheduleUrl: '../../data/schedule.json',
            scheduleStatus: false,
            hasRun: false,
            speakersResponse: function(event, response) {
                this.speakers = response.response;
                this.speakerStatus = true;
                this.checkStatus();
            },
            sessionsResponse: function(event, response) {
                this.sessions = response.response;
                this.sessionStatus = true;
                this.checkStatus();
            },
            scheduleResponse: function(event, response) {
                this.schedule = response.response;
                this.scheduleStatus = true;
                this.checkStatus();
            },
            checkStatus: function () {
              if (this.speakerStatus && this.sessionStatus && this.scheduleStatus && !this.hasRun) {
                this.callMe();
                this.hasRun = true;
              }
            },
            callMe: function() {
                console.log('I was called after all json files loaded');
            }
        });
    })();
    </script>
  </polymer-element>

您可以在 core-ajax 元素上使用 on-core-complete 事件来检查 json 何时加载。 例如 <core-ajax auto url="{{scheduleUrl}}" handleAs="json" on-core-complete="{{scheduleResponse}}"></core-ajax>

阅读更多:https://www.polymer-project.org/0.5/docs/elements/core-ajax.html

这应该可以解决问题。通过使用 observe ,您可以在每次更改时检查值并等待所有三个值都出现。您还可以直接绑定到 core-ajaxresponse 属性,而不必执行 setter.

<polymer-element name="my-schedule" attributes="speakersUrl sessionsUrl scheduleUrl">
    <template>
        <core-ajax auto url="{{scheduleUrl}}" handleAs="json" response="{{speakers}}"></core-ajax>
        <core-ajax auto url="{{sessionsUrl}}" handleAs="json" response="{{sessions}}"></core-ajax>
        <core-ajax auto url="{{speakersUrl}}" handleAs="json" response="{{schedule}}"></core-ajax>
    </template>
    <script>
    (function() {
        Polymer('my-schedule', {
            speakersUrl: '../../data/speakers.json',
            sessionsUrl: '../../data/sessions.json',
            scheduleUrl: '../../data/schedule.json',
            observe: {
              'speakers schedule sessions': 'checkReady'  
            },
            checkReady: function() {
              if (this.sessions && this.speakers && this.schedule) { this.callMe(); }
            },
            callMe: function() {
                console.log('I was called after all json files loaded');
            }
        });
    })();
    </script>
</polymer-element>