ポップアップ ngDialog (astore.github.io/ngDialog など) で w2grid (w2.com) を使用すると、通常のページで使用する場合とは異なるコードが必要になる理由を理解しようとしています。Angular 1.4.8 を使用しています。
通常のページ HTML では、コントローラーを指定する div 内に w2grid 用の div を予約します。
<div data-ng-controller="CtrlViewEdit" >
<div id="gridViewEdit" style="width:1500px; height:800px; display:none;" ></div>
</div>
CtrlViewEdit コントローラー コンストラクター関数で、div を見つけ、その上に w2grid を構築します。
$('#gridViewEdit').w2grid({name:'gridViewEdit', ...etc
これはうまくいきます。ページにグリッドが表示されます。
他の場所では、グリッド付きのモーダル ダイアログをポップアップさせたいと考えています。同様に、ダイアログのテンプレートには、ダイアログのコントローラーの div 内にグリッドの div があります。
<div data-ng-controller="PopupSelectRetailer" >
<input ng-model="searchName" />
<div id="gridSelectRetailer" style="width:750px; height:500px; display:block;" ></div>
<br /><br />
{{searchName}}
<div class="ngdialog-buttons">
<button type="button" class="ngdialog-button ngdialog-button-secondary" ng-click="closeThisDialog(0)">Close</button>
</div>
</div>
このテンプレート (PopupSelectRetailer.html) は、次のようなコードで ngDialog.open に渡されます。
var myScope = $scope.$new();
ngDialog.open(
{
width: 1000,
template: "PopupSelectRetailer.html",
className: 'ngdialog-theme-default',
closeByDocument:false,
showClose: false,
scope: myScope
});
上記と同様に、ダイアログのコントローラー (PopupSelectRetailer) が単にこれを行う場合:
$('#gridSelectRetailer').w2grid({name: 'gridSelectRetailer', ...etc
ダイアログはグリッドなしで表示されます。実際に機能させるには、コントローラーでのように、ngDialog が開かれるまで、ダイアログでの w2grid の作成を延期する必要があります。
$scope.$on('ngDialog.opened', InitializeNonAngular);
function InitializeNonAngular()
{
$('#gridSelectRetailer').w2grid({name: 'gridSelectRetailer', ...etc
私たちの質問は「なぜ?」です。Angular がテンプレートを正常にロードする場合と、ngDialog 内でロードする場合に違いがあるのはなぜですか?
通常の場合、グリッド用に予約された div はコントローラー コンストラクターの実行時に DOM にあるように見えます。そのため、jquery はその時点でそれを見つけて w2grid に置き換えることができます。
一方、ngDialog の場合、グリッド用に予約された div が DOM にある前にコントローラー コンストラクターが実行されているように見えるため、jquery が検索して w2grid に置き換えるものは何もありません。代わりに、ngDialog.open が完了するまで待つ必要があり、その時点でテンプレートが完全に読み込まれます。
ただし、ngDialog の場合、テンプレートは少なくとも部分的に読み込まれています。それ以外の場合、コントローラー コンストラクターはまったく実行されません。指定されている場所はテンプレート内だけです。
この操作の順序の違いは何によって説明されますか? これは単に ngDialog について「知っておく」必要があるものですか、それともより広い原則が働いているのでしょうか?