Неблокирующая асинхронная функция Polymer, связанная с шаблоном

#javascript #asynchronous #polymer

#javascript #асинхронный #polymer

Вопрос:

У меня есть шаблон

 <core-list data="{{ list }}" height="80">
    <template>
        <app-list-item transaction="{{ transaction }}"></app-list-item>
    </template>
</core-list>
  

и часть js, которая устанавливает это.список данных

 # Polymer("app-list", {

ready: function() {
    this.list = null;
},
activeChanged: function(oldValue, isActive) {
    if (isActive == "1") {
        this.initialize();
    }
},
initialize: function() {
    var response = this.fetchListData();
    this.list = response.data;
}
  

Я могу запускать, initialize() когда элемент шаблона активируется с помощью attributeChangedCallback() (нажатием кнопки)

Я получаю this.list данные из внешнего API с помощью XMLHttpRequest() , и этот запрос требует времени.

Итак, когда я нажимаю кнопку для активации моего элемента, приложение зависает на несколько секунд просмотра.

Есть ли способ создать какой-то метод обратного вызова, который будет заполнять это.перечислять только после поступления данных API? До тех пор это.список должен оставаться нулевым.

Ответ №1:

Хороший способ сделать это с <core-ajax> :

 <core-ajax auto url="http://www.google.com/calendar/feeds/developer-calendar@google.com/public/full?alt=json" handleAs="json" response="{{list}}"></core-ajax>
<core-list data="{{ list.feed.entry }}" height="80">
  <template>
    <div>{{title.$t}}</div>
  </template>
</core-list>
  

Демонстрация:http://jsbin.com/nasibiqe/1/edit

auto Атрибут сообщает core-ajax выполнить запрос, как только элемент будет готов. Затем мы привязываем data атрибут core-list к response атрибуту ajax с данными. Это заполняет список только при наличии данных. Если вместо этого вы хотите отправлять запрос XHR при нажатии кнопки, удалите auto attr:

 <core-ajax id="ajax" url="..." handleAs="json" response="{{list}}"></core-ajax>
<button on-click="{{go}}">Go</button>

go: function() {
  this.$.ajax.go();
}
  

Demo: http://jsbin.com/giwujija/1/edit

Комментарии:

1. Привет, Эрик, у polymer 1.0 уже есть эквивалентное решение для этого? Спасибо!

2. elements.polymer-project.org/elements/iron-ajax является версией core-ajax 1.0. Должна быть способна выполнять то же самое, что и this post, однако синтаксис мог немного измениться. Мы также все еще переносим core-list.