混合聚合物1.0和Angular 1.x

Mixing Polymer 1.0 and Angular 1.x

本文关键字:Angular 聚合物 混合      更新时间:2023-09-26

我有一个Angular 1。x应用程序,我正试图在Polymer 1.0的帮助下更新材料设计。我必须声明,我只是使用纸张元素作为正常的构建块,我没有编写任何自定义的聚合物代码。

到目前为止,我遇到了2个问题,都处理嵌套的聚合物元素,所以我想解决方案将是相同的或至少非常相似。


问题1

在纸质项目上使用ng-repeat

HTML代码(使用Angular模板语法)

<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-itemdiv)。


问题2

试图用谷歌地图在地图上显示一个标记。地图居中,但没有标记。

HTML代码(使用Angular模板语法)

<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-markerNaN作为纬度经度,而外部google-map按预期工作。这就解释了为什么地图居中可以,但没有标记。


TL;博士

嵌套聚合物元素和使用Angular的双胡子语法可能会导致冲突,因为内部的聚合物元素将其视为聚合物代码,而不是Angular代码。

有什么办法可以解决这个问题吗?

如果你的目标是使用Material Design(这对于基于web的应用归结为使用正确的主题),我刚刚看到了Angular Material (https://material.angularjs.org/latest/#/)。也许那会有帮助?

第一个问题可以通过使用

来解决
window.Polymer = {dom: 'shadow'};

如Justin Fagnani在评论中所述,与聚合物文档中的语法略有不同,否则在Firefox/IE中将无法识别,请参阅https://github.com/Polymer/polymer/issues/1844

但是,我想这意味着您不会得到任何性能改进,这是由shady DOM引入的。