Подтвердить что ты не робот

Mixing Polymer 1.0 и Angular 1.x

У меня есть приложение Angular 1.x, которое я пытаюсь обновить до материального дизайна с помощью Polymer 1.0. Я должен заявить, что я использую только бумажные элементы как обычные строительные блоки и что я не пишу какой-либо пользовательский Полимерный код.

До сих пор я столкнулся с двумя проблемами, связанными с вложенными элементами Polymer, поэтому я думаю, что решение будет таким же или, по крайней мере, очень похожим.


Проблема 1

Используя ng-repeat на paper-item.

HTML-код (с синтаксисом Angular templating)

<paper-item data-ng-repeat="event in events">
    <paper-item-body two-line>
        <div>{{event.title}}</div>
        <div secondary>{{event.description}}</div>
    </paper-item-body>
</paper-item>

Следующий код не запускается, так как он вызывает следующую ошибку:

TypeError: Cannot read property 'childNodes' of undefined
    at g (angular.js:7531)
    at g (angular.js:7531)
    at N (angular.js:8127)
    at g (angular.js:7527)
    at angular.js:7402
    at $get.h (angular.js:7546)
    at m (angular.js:8159)
    at angular.js:27052
    at Object.fn (angular.js:15474)
    at m.$get.m.$digest (angular.js:15609)

Однако, если я использую следующий код, код запускает без ошибок:

<div data-ng-repeat="event in events">
    <paper-item-body two-line>
        <div>{{event.title}}</div>
        <div secondary>{{event.description}}</div>
    </paper-item-body>
</div>

Обратите внимание, что я только изменил корневой элемент (от paper-item до div).


Проблема 2

Попытка использовать google-map для отображения маркера на карте. Центры карт, но маркера нет.

HTML-код (с синтаксисом Angular templating)

<google-map latitude="{{event.y_wgs}}" longitude="{{event.x_wgs}}">
    <google-map-marker latitude="{{event.y_wgs}}" longitude="{{event.x_wgs}}"></google-map-marker>
</google-map>

Выход HTML (как скомпилирован Angular во время выполнения):

<google-map latitude="12.345" longitude="12.345">
    <google-map-marker latitude="NaN" longitude="NaN"></google-map-marker>
</google-map>

Обратите внимание, что внутренний тег google-map-marker имеет NaN как широту и долготу, а внешний google-map работает по назначению. Это объясняет, почему центры карт ОК, но маркер отсутствует.


TL; DR

Вложенные полимерные элементы и использование синтаксиса двойного усы Angular, вероятно, вызывают конфликт, так как внутренние полимерные элементы рассматривают его как код полимера, а не Angular.

Есть идеи, как решить эту проблему?

4b9b3361

Ответ 1

Если ваша цель - использовать Material Design (который для веб-приложений сводится к использованию правильных тем), я просто увидел Angular Материал (https://material.angularjs.org/latest/#/). Может, это поможет?

Ответ 2

Первая проблема может быть решена с помощью

window.Polymer = {dom: 'shadow'};

как указано Джастином Фагнани в комментариях, с немного отличающимся синтаксисом, чем указано в полимерных документах, иначе он не будет распознан в Firefox/IE, см. https://github.com/Polymer/polymer/issues/1844

Однако, я думаю, это означает, что вы не получите каких-либо улучшений производительности, которые были введены с теневым DOM.