0

次のコード スニペットがあります。

<my-header></my-header>
<div ng-switch="$ctrl.page">
        <div ng-switch-when="1"><component1></component1></div>
        <div ng-switch-when="2"><component2></component2></div>
        <div ng-switch-when="3"><component3></component3></div>
</div>

ngSwitchディレクティブがアクションを実行する前に、コンポーネントmyHeaderが構築されることを望みます。これで、 component1がmyHeaderの前に構築されます。

ルーティングは次のコードを表します。

$stateProvider
  .state({
    name: 'myApp',
    url: '/',
    component: 'loader',
  })
  .state({
    name: 'myApp.pages',
    url: 'pages/{id:int}',
    component: 'loader'
  });
$urlRouterProvider.otherwise('/pages/1');
4

1 に答える 1

1

これは、 myHeaderディレクティブ内のリンク関数でコントローラーを公開することで実現できます。

これにより、コントローラーに変数を簡単に追加し、ng-ifで ng-switch div の可視性を制御できます。こちらのコード スニペットを確認してください。

ああ、 ng-switchディレクティブを含む div にng-cloakを追加することを忘れないでください。

angular
        .module('app', [])
        .controller('TestController', function($scope) {
            this.page = 1;
        })
        .directive('myHeader', function () {
            return {
                link: function (scope, element, attrs) {
                    // With element.controller() we can reach the controller that is wrapping our directive. Then, we can simply set the headerIsLoaded variable to true.
                    element.controller().headerIsLoaded = true;
                },
                scope: true,
                templateUrl: 'my-header.html'
            }
        });
<div ng-controller="TestController as ctrl">

    <my-header></my-header>

    <!-- Add a visual feedback so user knows the components are being loaded -->
    <div ng-if="!ctrl.headerIsLoaded">
        Loading...
    </div>

    <!-- If ctrl.headerIsLoaded is set to true, the ng-switch will appear -->
    <div ng-if="ctrl.headerIsLoaded"
         ng-cloak>
        <div ng-switch="ctrl.page">
            <div ng-switch-when="1">
                Page 1
            </div>
            <div ng-switch-when="2">
                Page 2
            </div>
            <div ng-switch-when="3">
                Page 3
            </div>
        </div>
    </div>

</div>
于 2017-09-03T03:36:40.357 に答える