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>
これはすべてかなりクールです。1 つの例外を除いて、期待どおりにまったく同じように動作し<x-display>
ます。各人に 1 つずつ、大量のタグを配置し、それらに正しい値を入力します。オカレンスがフラッシュアップしないPolymer
ように、値をデフォルトでnullにする呼び出しを行いますが、それ以外は素晴らしくシンプルです。{{ p.value }}
問題は、ネストXDisplayController
されたものがAngularjsによって解析されないため、実際のコントローラーにならないことです。次のように定義した場合:
function XDisplayController($scope) {
$scope.text = "blah blah";
console.log("this never gets printed");
}
惜しくも手付かずのままです。
angularjs にテンプレートを認識させるにはどうすればよいでしょうか。理想的には、親スコープを継承させて、Angular ディレクティブによってページに配置されたかのように動作させるにはどうすればよいでしょうか?
$compileと関係があるのではないかと思いますが、動作させることができません。
ああ、Polymer にはライフサイクル コールバックがあることに言及する必要があります。これは、angularjs コードをリンクするものを呼び出すのにおそらく適切な場所です。
編集: Element.contents() を element.context.impl に変更して CodeHater のコードを試したところ、次のエラーが発生しました。
An attempt was made to reference a Node in a context where it does not exist.
これは、Shadow DOM と、ポリマーによって作成されたタグが独自のコンテキストを持つ方法に関係していると思います。