我有一个Polymer组件(Web 组件),并在其中放置了一个角度控制器,如下所示:
<polymer-element name="x-display"
attributes="title body">
<template>
<h2>{{title}}</h2>
<p>{{body}}</p>
<p ng-controller="XDisplayController" ng-bind="text"></p>
</template>
<script>
Polymer('x-display', {
title: "",
body: ""
});
</script>
</polymer-element>
被<x-display>
放置在这样的页面上:
<div ng-controller="PeopleController">
<h1>People</h1>
<input ng-model="query" type="text">
<x-display ng-repeat="p in people | filter:query"
title="{{ p.name }}" body="{{ p.body }}"></x-display>
</div>
这一切都很酷。除了一个例外,它的行为与您预期的完全相同,放置一大堆<x-display>
标签,每个人一个,并用正确的值填充它们。我将调用Polymer
默认值设置为 null 以便{{ p.value }}
事件不会闪现,但除此之外它很好而且简单。
问题是嵌套XDisplayController
的永远不会被 Angularjs 解析,因此永远不会成为真正的控制器。如果我这样定义它:
function XDisplayController($scope) {
$scope.text = "blah blah";
console.log("this never gets printed");
}
遗憾的是,它没有受到影响。
我将如何让 angularjs 了解模板,理想情况下,我将如何使其继承父范围,以便它的行为就像被放置在页面上一样,就像被 angular 指令一样?
我怀疑它可能与$compile有关,但我无法让它工作。
哦,我应该提到 Polymer 有生命周期回调,这可能是调用任何链接 angularjs 代码的合适位置。
编辑:我尝试了 CodeHater 的代码,将 element.contents() 更改为 element.context.impl 并得到以下错误:
An attempt was made to reference a Node in a context where it does not exist.
我认为这与 Shadow DOM 以及聚合物创建的标签如何拥有自己的上下文有关。