Угловое — полимерное взаимодействие

Я планирую попробовать проект на AngularJS, в котором все компоненты будут разрабатываться с использованием Polymer. Теперь, прежде чем начать этот проект, у меня есть пара вопросов:

  1. Могу ли я обновить модель данных компонента Polymer (также через пользовательский интерфейс) после получения данных с помощью сервисов Angular? И если да, то по возможности поделитесь примером.

  2. Могу ли я вызвать службы Angular, скажем, для получения данных из компонента Polymer? (Скажем, у меня есть компонент User Control as Polymer для проверки учетных данных пользователя через Angular Services против MongoDB)?

    Пожалуйста, поделитесь примером, если это возможно.


person Pulak Kanti Bhattacharyya    schedule 19.03.2014    source источник


Ответы (2)


С этой настройкой будут некоторые сложности.

Во-первых, Angular не знает, как привязываться к пользовательским элементам, поэтому привязка изнутри Angular к компоненту Polymer, например:

<my-element foo="{{ bar }}">

установит атрибут foo элемента, который может быть только строкой, но не будет использовать Node.bind для установки привязки к свойству foo. Это большая проблема для привязки сложных объектов или когда вам нужна двусторонняя привязка.

Я создал директиву, позволяющую использовать Node.bind из Angular, но только для Dart. Вы можете перенести его на JS: https://github.com/google/angular_node_bind.dart.

Он работает, захватывая выражения в двойных квадратных скобках и настраивая выражение наблюдения и привязку через Node.bind. Предыдущий пример изменится на:

<my-element foo="[[ bar ]]">

Привязка двусторонняя. Если <my-element> изменит значение foo, значение bar будет обновлено.

Вторая проблема — внедрение зависимостей. Поскольку за создание пользовательского элемента отвечает браузер, Angular не знает, когда они созданы, и не имеет возможности внедрить зависимости. Итак, вам нужен способ для элемента Polymer получить доступ к сервису Angular (или любому сервисному объекту, Angular или нет).

После того, как вы используете что-то вроде angular-node-bind, вы можете использовать привязки для передачи службы элементу. Может быть так:

<my-element http-service="[[ $http ]]">

(Поскольку я на самом деле не эксперт по Angular, я просто пытался заставить Angular и Polymer работать вместе, я не уверен на 100%, что $http доступен только в выражениях).

Команда Angular заявила, что намерена поддерживать пользовательские элементы в Angular 2.0, хотя их недавний пост в блоге не упоминает.

person Justin Fagnani    schedule 19.03.2014
comment
Хм ... спасибо, Джастин имеет смысл с точки зрения архитектуры - хотя нужно выяснить детали уровня реализации :) Я вижу потребность в МОСТЕ между полимерным слоем (читай Shadow DOM) и браузером, который может прослушиваться другими фреймворками. Проще говоря, объекты Polymer должны поднимать события (по крайней мере, собственные) до уровня браузера, на который будут подписываться JS-фреймворки. - person rahul; 20.03.2014

Полимерные элементы — это обычные элементы. Если вы устанавливаете для них свойства, вызываете для них методы и слушаете их события, не должно возникнуть никаких сложностей при их использовании с другими фреймворками или библиотеками. Это полностью по дизайну.

Может показаться заманчивым перекрестно связать элементы Angular и Polymer, но это сложно и не обязательно. Я бы определенно не советовал начинать таким образом.

person Scott Miles    schedule 19.03.2014