Интеграция Material Design Lite с AngularJS

Мне известен материал Angular, который помогает реализовать спецификацию дизайна материалов для использования в одностраничных приложениях Angular.

Однако я рассматриваю альтернативу Material Design Lite для интеграции с моим проектом Angular. Я хотел бы узнать, как лучше всего интегрировать Material Design Lite с приложением AngularJS.


person dantheta    schedule 07.07.2015    source источник
comment
getmdl.io/started/index.html   -  person Sean    schedule 07.07.2015
comment
Согласно Material Design Lite, преимущество заключается в том, что для его работы вам не нужны никакие библиотеки JavaScript. Если вы уже используете AngularJS, почему бы просто не использовать Angular Material?   -  person yvesmancera    schedule 07.07.2015
comment
@yvesmancera Даже если он использует Angular, ему может понадобиться облегченная библиотека пользовательского интерфейса. Проверьте мой ответ для более подробной информации   -  person Jad Joubran    schedule 08.07.2015


Ответы (5)


Второй ответ Эмджея сработал для меня. Вы можете дополнительно уменьшить шаблон, добавив метод upgradeAllRegistered в блок run Angular:

angular.module('app', [])
    .run(function ($rootScope,$timeout) {
        $rootScope.$on('$viewContentLoaded', ()=> {
          $timeout(() => {
            componentHandler.upgradeAllRegistered();
          })
        })
      });
person mpint    schedule 12.07.2015
comment
Да, я изменил свой проект, чтобы отразить это. Спасибо. - person kelsmj; 18.07.2015
comment
Я новичок в angular и был бы очень признателен, если бы вы могли сделать jsfiddle в качестве примера для меня. У меня те же проблемы с angular и MDL, что и у OP. - person realappie; 08.10.2015
comment
Я считаю, что это работает, но есть проблема. В последней версии MDL автофокусировка текстового поля исправлена, и это не работает, когда есть вызов $ timeout для componentHandler.upgradeAllRegistered(). Он работает без вызова $timeout, но все еще возникает проблема, когда вы переключаете состояния в маршрутизаторе пользовательского интерфейса. - person dgrubelic; 10.02.2016
comment
Кроме того, обновление всех компонентов MDL, когда ng-include загружал свой контент путем регистрации в событии $includeContentLoaded, устранило случайные проблемы с панелью навигации в моем случае. - person Yann; 18.09.2017

Отказ от ответственности: я являюсь автором этого проекта

Вы можете использовать Material Design Lite в своих угловых приложениях.
Я полагаю, вы ищете угловую оболочку поверх Material Design Lite.

Этот пакет находится в активной разработке, и в нем уже реализованы некоторые директивы с настраиваемыми параметрами (плавающие текстовые поля) http://jadjoubran.github.io/angular-material-design-lite/

Если вам нужен полный пользовательский интерфейс, написанный на angular, вы можете использовать Angular Material.

person Jad Joubran    schedule 08.07.2015
comment
Если вы собираетесь размещать ссылки на свои собственные проекты, пожалуйста, поставьте дисклеймер. - person Xarus; 10.07.2015
comment
@Xarus ты прав! Спасибо за дружеское уведомление. я исправил свой ответ - person Jad Joubran; 10.07.2015
comment
@JadJoubran Если я использую и материал angulat, и облегченный дизайн материалов, будет ли какой-либо конфликт? - person nicky; 16.10.2015
comment
@nicky это не рекомендуется. Но это может работать хорошо, потому что каждая библиотека имеет свой префикс/пространство имен для своего css (mdl и md). Это объясняет разницу scotch.io/bar-talk/angular- материал-против-материал-дизайн-облегченный - person Jad Joubran; 16.10.2015

У меня была эта проблема с рендерингом, больше элементов дизайна динамически использовало javascript CDM (например, меню), оно не отображалось правильно. Я создал решение для запуска componentHandler.upgradeDom() только при добавлении нового элемента:

var app = angular.module('app');
app.run(function () {
    var mdlUpgradeDom = false;
    setInterval(function() {
      if (mdlUpgradeDom) {
        componentHandler.upgradeDom();
        mdlUpgradeDom = false;
      }
    }, 200);

    var observer = new MutationObserver(function () {
      mdlUpgradeDom = true;
    });
    observer.observe(document.body, {
        childList: true,
        subtree: true
    });
    /* support <= IE 10
    angular.element(document).bind('DOMNodeInserted', function(e) {
        mdlUpgradeDom = true;
    });
    */
});

Задача решена!

person Douglas Bernardes    schedule 11.08.2015
comment
Это работает и при использовании фреймворка Ionic. Спасибо! - person Avijit Gupta; 21.11.2015
comment
Хорошо, это просто помогло мне интегрировать MDL с Angular 2 :) - person dSebastien; 27.11.2015
comment
Насколько это эффективно, поскольку оно соблюдает весь документ document.body правильно? Есть ли здесь какой-нибудь трюк с MutationObserver, который поддерживает эффективность этого метода? - person Lambros Petrou; 20.12.2015
comment
Спасибо. Это обеспечивает простой способ интеграции меню MDL с визуализированными компонентами angularjs. Я использую этот метод запуска чуть выше контроллера только на необходимых страницах (у вас может быть несколько блоков запуска angularjs) - person rjha94; 02.01.2017

Вы можете включить файлы .css и .js, как указано на веб-сайте Material Design Lite, а затем просто выполните следующие действия при начальной загрузке вашего приложения или при загрузке контроллера.

angular.element(document).ready( 
      function() {
        componentHandler.upgradeAllRegistered();
    });

or

$scope.$on('$viewContentLoaded', () => {
  $timeout(() => {
    componentHandler.upgradeAllRegistered();
  })
});
person kelsmj    schedule 09.07.2015
comment
Я использовал первое решение, и оно решило мою проблему. Спасибо! - person DamienMann; 17.03.2016

Существует менее грубый способ обновления элементов: нет необходимости проверять интервалы или обновлять весь DOM, когда что-то меняется. MutationObserver уже сообщает вам, что именно изменилось.

window.addEventListener('load', function() {
  var observer = new MutationObserver(function (mutations) {
    mutations.forEach(function( mutation ) {
      if (mutation.addedNodes)
        window.componentHandler.upgradeElements(mutation.addedNodes);
    })
  });
  observer.observe(document.body, {
      childList: true,
      subtree: true
  });
});
person John Hardy    schedule 13.01.2017