Совместное поведение между лениво загруженными частями приложения
Как демонстрирует Polymer Starter Kit или Polymer Shop, мы используем ленивую загрузку в нашем приложении Polymer. Это означает, что у нас есть макет на основе ящика, а оболочка приложения импортирует содержимое ящика, а также содержимое главной страницы.
Теперь мы вводим поведение и используем его в пользовательских элементах A и B, где A отображается в блоке, а B - на главной странице. Теперь мы получаем предупреждение браузера (Chrome), что flattenBehaviorsList
не мог найти поведение.
Мы предполагаем, что это происходит потому, что Polymer.importHref
вызов (опция async
является true
) для главной страницы распознает поведение (в пользовательском элементе B) и добавляет его импорт на карту импорта HTML. Но прежде чем контент будет импортирован, Polymer.importHref
(опция async
является true
) вызов для ящика хочет импортировать поведение для пользовательского элемента A и берет содержимое с карты импорта HTML. Но так как импорт не выполнен, поведение null
,
Это предположение верно? И если да, то это ошибка в Chrome - просто идея, поскольку кажется, что Firefox справляется с этим? Или это плохой дизайн, и мы не должны вести себя одинаково в разных лениво загруженных частях приложения?
Как вы думаете?
заранее спасибо
2 ответа
Ленивая загрузка - это предпочтительный способ загрузки ресурсов, который вам не нужен сразу. Но вы должны сделать это правильно, что я объясню чуть позже.
Поведение в отдельном файле и его повторное использование в нескольких пользовательских элементах также очень нормально и даже приветствуется. Однако все ресурсы, которые нужны пользовательскому компоненту, должны быть загружены как обычно. rel="import"
означает async
а также defer
флаги не должны быть установлены.
Например, взгляните на следующий демонстрационный элемент, взятый из страниц разработчика Polymer:
<link rel="import" href="highlight-behavior.html">
<script>
Polymer({
is: 'my-element',
behaviors: [HighlightBehavior]
});
</script>
Как видите, поведение импортируется как зависимость. Без этого, скорее всего, будет ошибка, как в вашем случае.
Теперь самое интересное - ленивая загрузка. Здесь вы фактически не загружаете все, что использует компонент. Таким образом, вы должны хорошо знать, какие ресурсы вы можете, а какие не можете лениво загружать. Как правило, вы должны загружать все, что вы используете / создаете непосредственно внутри компонента.
Некоторые распространенные примеры отложенной загрузки:
- Если у вас есть
iron-pages
element и все страницы являются пользовательскими элементами, тогда вам следует загружать только первую (по умолчанию) страницу по умолчанию, так как другие не будут использоваться сразу. - Вы можете поместить не существенные элементы GUI, такие как выдвижные боковые панели внутри
dom-if
и сделать этоdom-if
после того, как все компоненты лениво загружены. Самый простой способ для этого - использовать importHref.
Очень хороший пример для отложенной загрузки элементов - приложение Polymer's Shop: исходный код, онлайн-демонстрация.
Подводя итог: не ленивая загрузка обязательных зависимостей для пользовательского элемента, а ленивая загрузка самого элемента.
Я думаю, что у меня была такая же проблема сегодня. При использовании importHref async я получаю такие ошибки, как [paper-radio-button::_flattenBehaviorsList]: behavior is null, check for missing or 404 import
, но когда я изменяю на async = false, сообщения об ошибках исчезают.
Похоже, что это известная ошибка Polymer или Chrome https://github.com/Polymer/polymer/issues/2522