1

angular uiブートストラップ(ui.boostrap.modal)を使用してテンプレートに取り組んでいます。データ {{property}} は Ajax リクエストから作成されます。

<!-- template for the modal  box-->
    <div><a data-toggle="modal" href="#{{property.domId()}}"
           class="btn btn-default">{{property.label}}</a></div>
        <div id="{{property.domId()}}"
             class="modal fade" role="dialog">
            <div class="modal-dialog">
                <div class="modal-content">
                <div class="modal-body">
                    <div class="row">
                        <div class="col-md-12 panel panel-info">

                            <div class="panel-heading">
                        <span tooltip-placement="bottom"
                              tooltip-html-unsafe="{{property.tooltip}}">
                              {{property.label}}</span>
                            </div>
                            <div class="panel-body">
                                <div ng-repeat="property in property.value">
                                        <div ng-include="property.templateUrl">
                                        </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
                <div class="modal-footer">
                    <button class="btn btn-default" data-dismiss="modal">Close</button>
                </div>
                </div>
            </div>
        </div>

モーダル ウィンドウの一部のボタンは、$scope などのモデルを更新します。

問題は、ajax promise から戻った後、DOM がモーダル ボックスの再構築を開始することです。$digest の深いところのある時点で、要素のレンダリングに失敗し、モーダル ウィンドウが消えます。背景の影だけが残ります(これにより、何もクリックできなくなります)。

 <div class="modal-backdrop fade in"></div>

開発者ツールでは、DOM 全体が Angular によって完全に解決されていることがわかります。

4

1 に答える 1

3

後で役立つ可能性があるため、私は自分の質問に答えます。実際には、ui-bootstrap が Bootstrap 3 CSS を使用する方法ではありません。私はまだ bootstrap.js XD を使用しているため、HTML コードは AngularJS で動作しました。モーダルは Bootstrap3 によって表示されました... 同じユースケースでそれを行う方法を次に示します。

JS コード: モーダルを起動する open() 関数を作成します。テンプレートとコントローラーを提供する必要があります。特定のユースケースのため、スコープとして $scope を渡しています (スコープを理解せずにこのコードをそのままコピーしないでください)

    $scope.open = function () {
        var modalInstance = $modal.open({
            templateUrl: 'modalContent.html',
            controller: 'ModalInstanceController',
            scope: $scope
        });
    };

}]);

2 番目のコントローラー ModalInstanceController は、モーダル ボックスの「内側」にあるコントローラーです。スコープと作成されたモーダルを注入する必要があります。

testModule.controller('ModalInstanceController',
    ['$scope', '$modalInstance', function ($scope, $modalInstance) {

    $scope.close = function () {
        $modalInstance.close('close');
    };

    $scope.cancel = function () {
        $modalInstance.dismiss('cancel');
    };

パーシャルでは、 を使用してインライン テンプレートを作成できますtext/ng-template。モーダルはこのスクリプトの「内部」にあります。最後のボタンは、メイン コントローラーから open() を使用してモーダルを開きます。標準の BS3 では、 modal を対象とするボタンがありますid。ここで open() メソッドを呼び出す必要があります。これが、HTML で実行する必要がある主な回避策です。

<div>
    <script type="text/ng-template" id="modalContent.html">
        <div class="modal-header">{{property.label}}
        </div>
        <div class="modal-body">
            <div class="row">
                <div class="col-md-12 panel panel-info">

                    <div class="panel-heading">
                <span  tooltip-placement="bottom"
                      tooltip-html-unsafe="{{property.tooltip}}">
                      {{property.label}}</span>
                    </div>
                    <div class="panel-body">
                        <div ng-repeat="property in property.value">
                            <div ng-include="property.templateUrl">
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        <div class="modal-footer">
            <button class="btn btn-primary" ng-click="close()">OK</button>
            <button class="btn btn-warning" ng-click="cancel()">Cancel</button>
        </div>
    </script>

    <button class="btn btn-default" ng-click="open()">Open</button>
</div>
于 2013-10-03T09:51:44.087 に答える