2016-12-24 6 views
2

私はAngularjsを初めて使っていますが、問題はどこにあるのですか?ページがロードされるときにトグルボタンを開く予定ですsidenavを開く必要があります。 sidenavcontentよりトグルボタンをクリックすると、両方が一緒に動くはずです。Angularjsでsidenavとコンテンツを切り替える方法

私は以下のコードを設計しましたが、それに対応して問題が発生しています。

私はグーグルではありますが、私の要求に合ったコードは得られません。 Fiddle Link

angular 
 
    .module('MyApp',['ngMaterial', 'ngMessages', 'material.svgAssetsCache']) 
 
    .controller('AppCtrl', function ($scope, $timeout, $mdSidenav, $log) { 
 
    $scope.toggleLeft = buildDelayedToggler('left'); 
 
    $scope.toggleRight = buildToggler('right'); 
 
    $scope.isOpenRight = function(){ 
 
     return $mdSidenav('right').isOpen(); 
 
    }; 
 

 
    /** 
 
    * Supplies a function that will continue to operate until the 
 
    * time is up. 
 
    */ 
 
    function debounce(func, wait, context) { 
 
     var timer; 
 

 
     return function debounced() { 
 
     var context = $scope, 
 
      args = Array.prototype.slice.call(arguments); 
 
     $timeout.cancel(timer); 
 
     timer = $timeout(function() { 
 
      timer = undefined; 
 
      func.apply(context, args); 
 
     }, wait || 10); 
 
     }; 
 
    } 
 

 
    /** 
 
    * Build handler to open/close a SideNav; when animation finishes 
 
    * report completion in console 
 
    */ 
 
    function buildDelayedToggler(navID) { 
 
     return debounce(function() { 
 
     // Component lookup should always be available since we are not using `ng-if` 
 
     $mdSidenav(navID) 
 
      .toggle() 
 
      .then(function() { 
 
      $log.debug("toggle " + navID + " is done"); 
 
      }); 
 
     }, 200); 
 
    } 
 

 
    function buildToggler(navID) { 
 
     return function() { 
 
     // Component lookup should always be available since we are not using `ng-if` 
 
     $mdSidenav(navID) 
 
      .toggle() 
 
      .then(function() { 
 
      $log.debug("toggle " + navID + " is done"); 
 
      }); 
 
     } 
 
    } 
 
    }) 
 
    .controller('LeftCtrl', function ($scope, $timeout, $mdSidenav, $log) { 
 
    $scope.close = function() { 
 
     // Component lookup should always be available since we are not using `ng-if` 
 
     $mdSidenav('left').close() 
 
     .then(function() { 
 
      $log.debug("close LEFT is done"); 
 
     }); 
 

 
    }; 
 
    }) 
 
    .controller('RightCtrl', function ($scope, $timeout, $mdSidenav, $log) { 
 
    $scope.close = function() { 
 
     // Component lookup should always be available since we are not using `ng-if` 
 
     $mdSidenav('right').close() 
 
     .then(function() { 
 
      $log.debug("close RIGHT is done"); 
 
     }); 
 
    }; 
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-animate.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-route.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-aria.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-messages.min.js"></script> 
 
<script src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/t-114/svg-assets-cache.js"></script> 
 
<script src="https://cdn.gitcdn.link/cdn/angular/bower-material/v1.1.1/angular-material.js"></script> 
 

 

 
<link href="https://cdn.gitcdn.link/cdn/angular/bower-material/v1.1.1/angular-material.css" rel="stylesheet" /> 
 
<link href="https://material.angularjs.org/1.1.1/docs.css" rel="stylesheet" /> 
 

 

 
<div ng-controller="AppCtrl" layout="column" style="height:500px;" ng-cloak="" class="sidenavdemoBasicUsage" ng-app="MyApp"> 
 

 
    <section layout="row" flex=""> 
 

 
    <md-sidenav class="md-sidenav-left" md-component-id="left" md-is-locked-open="$mdMedia('gt-md')" md-whiteframe="4"> 
 

 
     <md-toolbar class="md-theme-indigo"> 
 
     <h1 class="md-toolbar-tools">Sidenav Left</h1> 
 
     </md-toolbar> 
 
     <md-content layout-padding="" ng-controller="LeftCtrl"> 
 
     <md-button ng-click="close()" class="md-primary" hide-gt-md=""> 
 
      Close Sidenav Left 
 
     </md-button> 
 
     <p hide="" show-gt-md=""> 
 
      This sidenav is locked open on your device. To go back to the default behavior, 
 
      narrow your display. 
 
     </p> 
 
     </md-content> 
 

 
    </md-sidenav> 
 

 
    <md-content flex="" layout-padding=""> 
 

 
     <div layout="column" layout-align="top center"> 
 
     <p> 
 
     The left sidenav will 'lock open' on a medium (=960px wide) device. 
 
     </p> 
 
     <p> 
 
     The right sidenav will focus on a specific child element. 
 
     </p> 
 

 
     <div> 
 
      <md-button ng-click="toggleLeft()" class="md-primary" > 
 
      Toggle left 
 
      </md-button> 
 
     </div> 
 

 
     <div> 
 
      <md-button ng-click="toggleRight()" ng-hide="isOpenRight()" class="md-primary"> 
 
      Toggle right 
 
      </md-button> 
 
     </div> 
 
     </div> 
 

 
     <div flex=""></div> 
 

 
    </md-content> 
 

 
    <md-sidenav class="md-sidenav-right md-whiteframe-4dp" md-component-id="right"> 
 

 
     <md-toolbar class="md-theme-light"> 
 
     <h1 class="md-toolbar-tools">Sidenav Right</h1> 
 
     </md-toolbar> 
 
     <md-content ng-controller="RightCtrl" layout-padding=""> 
 
     <form> 
 
      <md-input-container> 
 
      <label for="testInput">Test input</label> 
 
      <input type="text" id="testInput" ng-model="data" md-autofocus=""> 
 
      </md-input-container> 
 
     </form> 
 
     <md-button ng-click="close()" class="md-primary"> 
 
      Close Sidenav Right 
 
     </md-button> 
 
     </md-content> 
 

 
    </md-sidenav> 
 

 
    </section> 
 

 
</div>

+0

トグルボタンが既に存在し、右で動作しますか?あなたは何を期待していますか? –

+0

「sidenav」はページの読み込み時に開きますか?あなたは 'sidenav'と' content 'を一緒に動かすことについて何を思いついていますか、正確に動くことはどういう意味ですか? –

+0

@DivyanshuMaithaniのサイドバーをサイドバーについて開く必要があります。左側のサイドバーを開くと 'content'がそれに沿って動くはずです。' sidebar'の幅がコンテンツの25%幅の%の場合、左側の 'サイドバー'の幅が0%の場合、 'content'よりも隠された幅が100%になります。私の心に何があるのか​​理解してもらいたいと思います。ありがとう.. :) #Zeasts –

答えて

1

容器 フレックス元素であるが、サイドバーは、適用された絶対位置を有しているので、フレックスレイアウトで会計処理されません。

ただ相対的な位置に変更し、それが

angular 
 
    .module('MyApp', ['ngMaterial', 'ngMessages', 'material.svgAssetsCache']) 
 
    .controller('AppCtrl', function($scope, $timeout, $mdSidenav, $log) { 
 
    $scope.toggleLeft = buildDelayedToggler('left'); 
 
    $scope.toggleRight = buildToggler('right'); 
 
    $scope.isOpenRight = function() { 
 
     return $mdSidenav('right').isOpen(); 
 
    }; 
 

 
    /** 
 
    * Supplies a function that will continue to operate until the 
 
    * time is up. 
 
    */ 
 
    function debounce(func, wait, context) { 
 
     var timer; 
 

 
     return function debounced() { 
 
     var context = $scope, 
 
      args = Array.prototype.slice.call(arguments); 
 
     $timeout.cancel(timer); 
 
     timer = $timeout(function() { 
 
      timer = undefined; 
 
      func.apply(context, args); 
 
     }, wait || 10); 
 
     }; 
 
    } 
 

 
    /** 
 
    * Build handler to open/close a SideNav; when animation finishes 
 
    * report completion in console 
 
    */ 
 
    function buildDelayedToggler(navID) { 
 
     return debounce(function() { 
 
     // Component lookup should always be available since we are not using `ng-if` 
 
     $mdSidenav(navID) 
 
      .toggle() 
 
      .then(function() { 
 
      $log.debug("toggle " + navID + " is done"); 
 
      }); 
 
     }, 200); 
 
    } 
 

 
    function buildToggler(navID) { 
 
     return function() { 
 
     // Component lookup should always be available since we are not using `ng-if` 
 
     $mdSidenav(navID) 
 
      .toggle() 
 
      .then(function() { 
 
      $log.debug("toggle " + navID + " is done"); 
 
      }); 
 
     } 
 
    } 
 
    }) 
 
    .controller('LeftCtrl', function($scope, $timeout, $mdSidenav, $log) { 
 
    $scope.close = function() { 
 
     // Component lookup should always be available since we are not using `ng-if` 
 
     $mdSidenav('left').close() 
 
     .then(function() { 
 
      $log.debug("close LEFT is done"); 
 
     }); 
 

 
    }; 
 
    }) 
 
    .controller('RightCtrl', function($scope, $timeout, $mdSidenav, $log) { 
 
    $scope.close = function() { 
 
     // Component lookup should always be available since we are not using `ng-if` 
 
     $mdSidenav('right').close() 
 
     .then(function() { 
 
      $log.debug("close RIGHT is done"); 
 
     }); 
 
    }; 
 
    });
#sdleft { 
 
    position: relative; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-animate.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-route.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-aria.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-messages.min.js"></script> 
 
<script src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/t-114/svg-assets-cache.js"></script> 
 
<script src="https://cdn.gitcdn.link/cdn/angular/bower-material/v1.1.1/angular-material.js"></script> 
 

 

 
<link href="https://cdn.gitcdn.link/cdn/angular/bower-material/v1.1.1/angular-material.css" rel="stylesheet" /> 
 
<link href="https://material.angularjs.org/1.1.1/docs.css" rel="stylesheet" /> 
 

 

 
<div ng-controller="AppCtrl" layout="column" style="height:500px;" ng-cloak="" class="sidenavdemoBasicUsage" ng-app="MyApp"> 
 

 
    <section layout="row" flex=""> 
 

 
    <md-sidenav id="sdleft" class="md-sidenav-left" md-component-id="left" md-is-locked-open="$mdMedia('gt-md')" md-whiteframe="4"> 
 

 
     <md-toolbar class="md-theme-indigo"> 
 
     <h1 class="md-toolbar-tools">Sidenav Left</h1> 
 
     </md-toolbar> 
 
     <md-content layout-padding="" ng-controller="LeftCtrl"> 
 
     <md-button ng-click="close()" class="md-primary" hide-gt-md=""> 
 
      Close Sidenav Left 
 
     </md-button> 
 
     <p hide="" show-gt-md=""> 
 
      This sidenav is locked open on your device. To go back to the default behavior, narrow your display. 
 
     </p> 
 
     </md-content> 
 

 
    </md-sidenav> 
 

 
    <md-content flex="" layout-padding=""> 
 

 
     <div layout="column" layout-align="top center"> 
 
     <p> 
 
      The left sidenav will 'lock open' on a medium (=960px wide) device. 
 
     </p> 
 
     <p> 
 
      The right sidenav will focus on a specific child element. 
 
     </p> 
 

 
     <div> 
 
      <md-button ng-click="toggleLeft()" class="md-primary"> 
 
      Toggle left 
 
      </md-button> 
 
     </div> 
 

 
     <div> 
 
      <md-button ng-click="toggleRight()" ng-hide="isOpenRight()" class="md-primary"> 
 
      Toggle right 
 
      </md-button> 
 
     </div> 
 
     </div> 
 

 
     <div flex=""></div> 
 

 
    </md-content> 
 

 
    <md-sidenav class="md-sidenav-right md-whiteframe-4dp" md-component-id="right"> 
 

 
     <md-toolbar class="md-theme-light"> 
 
     <h1 class="md-toolbar-tools">Sidenav Right</h1> 
 
     </md-toolbar> 
 
     <md-content ng-controller="RightCtrl" layout-padding=""> 
 
     <form> 
 
      <md-input-container> 
 
      <label for="testInput">Test input</label> 
 
      <input type="text" id="testInput" ng-model="data" md-autofocus=""> 
 
      </md-input-container> 
 
     </form> 
 
     <md-button ng-click="close()" class="md-primary"> 
 
      Close Sidenav Right 
 
     </md-button> 
 
     </md-content> 
 

 
    </md-sidenav> 
 

 
    </section> 
 

 
</div>

+0

大丈夫、私はコンテナについて知りましたが、ページが読み込まれたら左側の「seidenav」を表示したい、ここでは隠しています。あなたはそれを私に知らせることができますか? –

関連する問題