私はあなたの例でいくつかのことを修正しました.今では関数を2回呼び出すだけです.
プランカーの作業フォーク: http://plnkr.co/edit/Aw6S6T?p=preview
重要な部分は次のとおりです。
app.directive('angularHtmlBind', function($compile, $http) {
return function(scope, elm, attrs) {
var $elm = $(elm),
url = 'search.jsp',
html,
currentScope;
function getHTML(url) {
$http.get('search.jsp').success(function(data) {
html = data;
currentScope = scope.$new();
$elm.html(html);
$compile($elm.contents())(currentScope);
}).error(function(data, status, headers, config) {
console.log(data);
});
}
scope.$watch(attrs.shown, function(value) {
if (value) {
getHTML(url);
} else if (currentScope) {
$elm.contents().remove();
currentScope.$destroy()
}
});
};
});
実装には 2 つの問題がありました。
- $httpを呼び出して、以下の行の結果を期待します。これは非同期呼び出しであるため、$compileを成功ハンドラーに移動しました。
- jspファイルがロードされるたびに同じスコープを再利用するため、同じオブジェクトを新しく作成されたコントローラーに渡します( $compile するたびに、コントローラーの新しいインスタンスが作成されます)。各jspファイルに新しいスコープを作成し、使用されなくなったら破棄しています。
もちろん、この例はさらに改善された可能性がありますが、問題を説明するためだけにサンプル ファイルを複数回ロードすることを想定しています;) そうでない場合は、一度呼び出してから、コンテンツを格納するhtml var を使用します。