Материал начальной загрузки не работает должным образом с динамическими угловыми представлениями

Я включаю сценарии материала-начальной загрузки в index.html моего проекта Angular, но для работы их необходимо вручную включить в представления.

Это странно, так как для всех других скриптов, вставленных в Angular, этого не происходит.

index.html

<script src="bower_components/bootstrap-material-design/scripts/material.js"></script>
<script src="bower_components/bootstrap-material-design/scripts/ripples.js"></script>

Я также заметил, что material-bootstrap плохо работает с Grunt и Bower, и имеет тенденцию удалять себя при сборке (следовательно, руководство включено внизу страницы).

Это известные ошибки с Material-boostrap и Angular/Bower/Grunt или я что-то не так делаю?

Если вам нужно что-то еще, пожалуйста, дайте мне знать!

редактировать:

зависимости в bower.json

"dependencies": {
    "angular": "~1.3.0",
    "json3": "~3.3.1",
    "es5-shim": "~3.1.0",
    "bootstrap": "~3.2.0",
    "angular-resource": "~1.3.0",
    "angular-cookies": "~1.3.0",
    "angular-sanitize": "~1.3.0",
    "angular-animate": "~1.3.0",
    "angular-touch": "~1.3.0",
    "angular-route": "~1.3.0",
    "bootstrap-material-design": "*",
    "jsjws": "~3.0.2",
    "angular-ui-router": "0.2.11"
  }

1 ответ

Решение

Проблема заключается в том, что плагин дизайна материала для начальной загрузки работает путем применения преобразований к DOM и не предназначен для автоматической работы с такими фреймворками, как Angular.

Материальная структура требует, чтобы вы объявили скрипт, подобный следующему, чтобы инициализировать компоненты:

<script>
  $.material.init();
</script>

Это означает, что объект "материализуется" при загрузке страницы. Поскольку приложение Angular.js является одностраничным, стиль применяется только к элементам, уже присутствующим на странице (попробуйте добавить новый компонент, также без использования представлений: вы должны получить тот же результат).

Вы получите требуемое поведение (не полностью функциональное), если вы включите сценарии в страницы представлений, потому что Angular.js под капотом загружает страницу представления как обычную страницу, затем берет содержимое dom и объединяет представление дерево с одностраничным деревом.

Я предлагаю вам попытаться добавить вызов $.material.init() после загрузки представления. Будьте осторожны, так как есть проблемы с многократным вызовом init из-за библиотеки ripples. Как указано здесь ( https://github.com/FezVrasta/bootstrap-material-design/issues/184), вам следует избегать ряби для повторного подключения обработчиков событий:

// add the "done" boolean inside ripples.js
window.ripples = { 
    init: function(withRipple) { /*bla bla*/ },
    done: false
}

// Then, where you run ripples.init... (aka, material.js, or maybe directly inside the init function of ripples.js)
if (!window.ripples.done) { 
  ripples.init();
  ripples.done = true;
}
Другие вопросы по тегам