#javascript #html #polymer
#javascript #HTML #полимер
Вопрос:
После проверки использования core-ajax на веб-сайте polymer я решил добавить функциональность ajax, используя core-ajax внутри моего элемента / виджета.
test-view.html
<link rel="import" href="bower_components/polymer/polymer.html">
<link rel="import" href="bower_components/core-ajax/core-ajax.html">
<polymer-element name="test-view" attributes="url">
<core-ajax id="elemAjax" url="{{url}}" handleAs="json"></core-ajax>
<template>
<div id="body"></div>
</template>
<script>
Polymer('test-view', {
ready: function() {
var ajax = this.$.elemAjax; // this line
ajax.addEventListener('core-response', function() {
console.log(this.response);
});
}
});
</script>
</polymer-element>
К сожалению, переменная «ajax» в моем скрипте возвращает «undefined». Как я могу загрузить ajax внутри элемента, используя core-ajax?
Побочный вопрос: доступен ли атрибут «id» внутри элемента polymer только внутри элемента polymer?
Комментарии:
1. Re: побочный вопрос, по сути, да. Узлы, созданные с помощью шаблона polymer, создаются в ShadowDOM (по умолчанию), поэтому они недоступны для запросов извне этого ShadowDOM.
Ответ №1:
Три основные проблемы:
- Он
core-ajax
должен находиться внутри шаблона, поэтому он является частью DOM каждого экземпляра (вот почемуajax
был не определен). - Вам нужен
auto
атрибут дляcore-ajax
(в противном случае вы должны вызватьgo()
методcore-ajax
для отправки запроса). - Ваш обработчик событий использует
this
, но не привязан к области видимости элемента. Предлагаю вам использовать делегирование событий вместоaddEventListener
.
Смотрите новый пример ниже. Другие (менее важные) настройки, которые я сделал:
- Удалите идентификатор из
core-ajax
, нам больше не нужно ссылаться на него. - Удалите
polymer.html
импорт,core-ajax
он уже импортирует его. - Удалите
test-view
параметр toPolymer()
, это не обязательно при определении элемента внутри импорта.
Модифицированный пример:
<link rel="import" href="bower_components/core-ajax/core-ajax.html">
<polymer-element name="test-view" attributes="url">
<template>
<core-ajax auto url="{{url}}" handleAs="json" on-core-response="{{ajaxResponse}}"></core-ajax>
<div id="body"></div>
</template>
<script>
Polymer({
ajaxResponse: function(event, response) {
console.log(response);
}
});
</script>
</polymer-element>
Еще лучше вообще избегать событий и привязывать данные непосредственно к данным ответа. Пример:
<link rel="import" href="bower_components/core-ajax/core-ajax.html">
<polymer-element name="test-view" attributes="url">
<template>
<core-ajax auto url="{{url}}" handleAs="json" response="{{response}}"></core-ajax>
<div id="body"></div>
</template>
<script>
Polymer({
responseChanged: function(oldValue) {
console.log(this.response);
}
});
</script>
</polymer-element>
Комментарии:
1. Что касается вашей «(менее важной)» настройки # 2: разве это не делает его элемент более хрупким? Что, если он переключится с использования core-ajax на какое-нибудь собственное решение для веб-компонентов в будущем? Не лучше ли для каждого элемента явно объявлять свои зависимости, например, для помощи в модульном тестировании?
2. Возможно, это спорно. Я склонен ошибаться в сторону «код, который вам не нужно отлаживать, — это код, который вам не нужно было писать».
3. Я думаю, что удаление этого импорта полимера просто вызывает проблемы в будущем. Нет никаких недостатков в том, чтобы сохранить его, поскольку
imports
не запрашивайте повторно ресурс, если он уже получен, а вулканизация (если вы это делаете) устраняет любые проблемы с дополнительными символами. Однако его исключение оставляет вас открытым для непреднамеренного удаления зависимости. / 2-центов4. Этот ответ все еще работает в polymer 1.0? Я попробовал это, заменив <polymer-element name=…> на <dom-component id= …> в определении пользовательского элемента, но, похоже, не могу получить доступ к переменной ответа
5. Для 1.0,
core-ajax
теперьiron-ajax
,response
был переименованlast-response
иhandleAs
должен быть записан какhandle-as
(при использовании в качестве атрибута). Кроме того, в 1.0responseChanged
обратный вызов должен быть явно подготовлен с помощьюproperties: { response: { observer: 'responseChanged' } }
.