Material Design Lite проблемы рендеринга с Angular JS
У меня есть некоторые проблемы с использованием Material Design Lite (getmdl.io ). я следовал шагам, показанным в getmdl.io web для того, чтобы установить его (на самом деле я использую bower), но у меня всегда есть одна и та же проблема, когда я изменяю ng-маршрут в моем вебе, некоторые ресурсы не отображаются должным образом, мне нужно перезагрузить страницу, чтобы получить ее должным образом, например.
Сначала у меня есть это:
Затем, когда я перезаряжаю, я получаю то, что я хочу:
Я не могу понять, почему другие ресурсы, такие как значки google или кнопки, работают правильно, но кнопка меню на навигационной панели и другие ресурсы, такие как этот, должны загружаться на страницу, чтобы правильно отрисовываться.
Я пытаюсь включить библиотеку, используя метод hosted и метод bower.
Есть идеи, что происходит?
2 ответов:
Библиотеки, подобные MDL, работают, ожидая загрузки страницы с помощью события DOMContentLoaded, сканируя страницу на предмет таких вещей, как входные элементы и манипулируя ими с помощью JavaScript, чтобы они могли вводить биты и фрагменты, необходимые для работы с их компонентами. Это прекрасно работает на статических веб-сайтах, но событие DOMContentLoaded срабатывает только один раз , поэтому, когда Angular выполняет переход страницы, DOM изменяется без ведома MDL.
Material Design Lite имеет раздел в его FAQ о использовании MDL на динамических веб-сайтах :
Material Design Lite автоматически регистрирует и визуализирует все элементы, помеченные классами MDL при загрузке страницы. Однако в случае, когда вы создаете элементы DOM динамически, вам нужно зарегистрировать новые элементы с помощью функции
upgradeElement. Вот как вы можете динамически создать ту же самую поднятую кнопку с рябью, показанную в разделе выше:<div id="container"/> <script> var button = document.createElement('button'); var textNode = document.createTextNode('Click Me!'); button.appendChild(textNode); button.className = 'mdl-button mdl-js-button mdl-js-ripple-effect'; componentHandler.upgradeElement(button); document.getElementById('container').appendChild(button); </script>Конечно, это, вероятно, не очень легко сделать в ваш случай, так как вы должны были бы вручную найти каждый новый элемент и вызвать
upgradeElementна нем.Обычно, вместо того, чтобы делать такого рода манипуляции DOM на основе событий, Angular использует директивы для инициирования изменений DOM. Вместо этого рассмотрите возможность использования библиотеки, построенной для взаимодействия с Angular, такой какAngular Material .
Я пропустил в своем коде эту функцию
angular.module('app', ['ngRoute']). run(function($rootScope, xxxx, xxx){ $rootScope.$on('$viewContentLoaded', function(event, next) { componentHandler.upgradeAllRegistered(); }); });Это сработало идеально! Удачи..


Comments