スコープ上のオブジェクトに応じて変更されるテンプレートが必要です。それはオブジェクトで文字列ではないので、テンプレート関数を使うことができないので、リンク関数を使ってhtmlを要素に追加しています。もちろん、私のhtmlは明示的に$補間される必要がありますので、ここで私はどうしたら結構です:リンク機能で追加されたHTMLはスコープにバインドされません
scope: {
obj: "=ngModel",
type: "<"
},
controllerAs: "display",
controller: function() {
let display = this;
// sets bunch of other functions, including booleanLabel and displayData
},
link: function(scope, element, attrs) {
let display = scope;
function template(type) {
switch (type) {
case ObjTypes.X:
return `<button ng-click="display.toggleBoolean(display.obj)">
{{display.booleanLabel(display.obj.data)}}
</button>`;
case ObjTypes.Y:
return `<button>
{{display.displayData(display.obj.data)}}
</button>`;
}
}
element.html($interpolate(template(display.type))(display));
}
これは動作しません。しかしここには奇妙なことがあります:display.obj
をちょうどobj
に置き換えると、その値が得られます。しかし関数はdisplay.function()
で呼び出す必要があります。
objが外部からスコープに置かれているのに対し、関数はコントローラによってスコープに置かれているとは限りませんが、信じられないほど奇妙で混乱します。さらに悪いことに、ng-clickは起動しません。私がdisplay.toggle()
を使うのか、それともtoggle()
だけ使うのかは関係ありません。しかし、display.bojではなくobjを渡す限り、display.booleanLabel()とdisplay.displayData()は正常に動作します。
ここでは何が起こっていますか?そして、これを理解して維持するのをより簡単にするにはどうしたらいいですか?
私はAngular 1.5を使用していますが、controllerAs: 'display'を使用し、display = scopeを使用してスコープがどこでも同じ名前を使用するようにします。要点は分かりやすくすることですが、明らかにここでは機能しません。
私は印象の下にありました$補間で十分でしょう。私はdomに新しいディレクティブを導入するつもりはなく、データバインディングだけです。私は現在、ng-ifとの別のルートを試していますが、それはまた驚くべき困難に繋がっています。テンプレート関数は、スコープへのアクセスを持たないため、文字列になる属性に対してのみ機能します。 – mcv