11

私はAngularJSを初めて使用し、2つの異なるHTMLパーシャルにロードされるリストとグリッドビューのトグルスイッチボタンの特定のチュートリアルを見つけることができませんでした. ng-include公式、公式ドキュメントを読み、 ng-switchSOを検索しました。残念ながら、 UI-routerは使用したくありません。

2 つのパーシャル (list.htmlおよびgrid.html) でロードすることは、これをコーディングする正しい Angular の方法ですか?

グリッドビュー

リストビュー


私が見つけた最も関連性の高いヘルプは次のとおりです。

1.http://tutorialzine.com/2013/08/learn-angularjs-5-examples (例 #5)

例 #5 には洞察に満ちたコメントがありました。

素敵な簡単な例 - よくできました。グリッド ビューとリスト ビューを切り替える最後の例は、オプションと表示/非表示の両方を作成するため、あまり効率的ではありません。よりシンプルで優れたアプローチは、リピーターと ng-switch で単一の ul を使用し、ng-switch-case を使用して代替リスト要素を有効にすることです。-ヨハン

2.http://www.adobe.com/devnet/html5/articles/getting-started-with-angularjs.html

3. https://stackoverflow.com/questions/12577378/create-a-single-html-view-for-multiple-partial-views-in-angularjs/12584774#12584774

4.https://stackoverflow.com/questions/15974086/conditional-ng-include-in-angularjs


私のHTMLコード

<div class="col-xs-6" ng-controller="ToggleDisplayCtrl">
  <div class="btn-group select-format-container" ng-switch on="selected">
    <button ng-switch-when="true" ng-click="toggleGrid()" type="button"
      class="btn btn-primary" ng-model="formatChoice" ng-disabled="">grid</button>
    <button ng-switch-when="false" ng-click="toggleList()" type="button"
      class="btn btn-primary" ng-model="formatChoice" ng-disabled="">list</button>
  </div>
  <div ng-include src="formatChoice.url" scope="" onload=""></div>
</div>
<!-- col-xs-6  END ToggleDisplayCtrl-->

私のJSコード

'use strict';
var app = angular.module('tempApp');

app.controller('ToggleDisplayCtrl', function($scope) {
  $scope.formatChoices = [{
      name: 'grid',
      url: 'partials/grid.html'
    },
    {
      name: 'list',
      url: 'partials/list.html'
    }
  ];

  $scope.selected = true;
  $scope.toggleGrid = function() {
    if (selected) {
      return "partials/grid.html";
    }
    return "main.html";
  };
  $scope.toggleList = function() {
    if (selected) {
      return "partials/list.html";
    }
    return "main.html";
  };
});
4

6 に答える 6

4

これを行う最も簡単な方法は次のとおりです。

<div class="bar">
  <h1>Contacts</h1>
  <a href="#" class="list-icon" ng-class="{active: layout == 'list'}" ng-click="layout = 'list'"></a>
  <a href="#" class="grid-icon" ng-class="{active: layout == 'grid'}" ng-click="layout = 'grid'"></a>
</div>
<div ng-show="layout == 'list'" class="list">
<!-- Add your list page here -->
<div ng-show="layout == 'grid'" class="grid">
<!-- Add your grid page here -->

CSS:

/*
  Contacts bar with toggle switches
*/

.bar {
  background-color: #5c9bb7;
  background-size: 100% 100%;
  box-shadow: 0 1px 1px #ccc;
  border-radius: 2px;
  height: 100px;
  padding: 10px;
  position: relative;
  text-align: right;
  line-height: 1;
}

.bar a {
  background: #4987a1 center center no-repeat;
  width: 32px;
  height: 32px;
  display: inline-block;
  text-decoration: none !important;
  margin-right: 5px;
  border-radius: 2px;
}

.bar a.active {
  background-color: #c14694;
}

.bar a.list-icon {
  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkYzNkFCQ0ZBMTBCRTExRTM5NDk4RDFEM0E5RkQ1NEZCIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkYzNkFCQ0ZCMTBCRTExRTM5NDk4RDFEM0E5RkQ1NEZCIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RjM2QUJDRjgxMEJFMTFFMzk0OThEMUQzQTlGRDU0RkIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RjM2QUJDRjkxMEJFMTFFMzk0OThEMUQzQTlGRDU0RkIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7h1bLqAAAAWUlEQVR42mL8////BwYGBn4GCACxBRlIAIxAA/4jaXoPEkMyjJ+A/g9MDJQBRhYg8RFqMwg8RJIUINYLFDmBUi+ADQAF1n8ofk9yIAy6WPg4GgtDMRYAAgwAdLYwLAoIwPgAAAAASUVORK5CYII=);
}

.bar a.grid-icon {
  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjBEQkMyQzE0MTBCRjExRTNBMDlGRTYyOTlBNDdCN0I4IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjBEQkMyQzE1MTBCRjExRTNBMDlGRTYyOTlBNDdCN0I4Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MERCQzJDMTIxMEJGMTFFM0EwOUZFNjI5OUE0N0I3QjgiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MERCQzJDMTMxMEJGMTFFM0EwOUZFNjI5OUE0N0I3QjgiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4MjPshAAAAXklEQVR42mL4////h/8I8B6IGaCYKHFGEMnAwCDIAAHvgZgRyiZKnImBQsACxB+hNoDAQyQ5osQZIT4gH1DsBZABH6AB8x/JaQzEig++WPiII7Rxio/GwmCIBYAAAwAwVIzMp1R0aQAAAABJRU5ErkJggg==);
}
/*-------------------------
  List layout
--------------------------*/

ul.list {
  list-style: none;
  width: 500px;
  margin: 0 auto;
  text-align: left;
}

ul.list li {
  border-bottom: 1px solid #ddd;
  padding: 10px;
  overflow: hidden;
}

ul.list li img {
  width: 120px;
  height: 120px;
  float: left;
  border: none;
}

ul.list li p {
  margin-left: 135px;
  font-weight: bold;
  color: #6e7a7f;
}
/*-------------------------
  Grid layout
--------------------------*/

ul.grid {
  list-style: none;
  width: 570px;
  margin: 0 auto;
  text-align: left;
}

ul.grid li {
  padding: 2px;
  float: left;
}

ul.grid li img {
  width: 280px;
  height: 280px;
  display: block;
  border: none;
}
于 2016-06-18T21:48:27.047 に答える
3

これは単純な作業 JSBin です: http://jsbin.com/jomiquqi/1/edit

ディレクティブはng-include、テンプレートに含める変数を受け取ります。したがって、コードを更新して機能させるには、toggleGrid()メソッドが何かを返すのではなくng-include、私の例のように渡すスコープに変数を設定する必要があります。

于 2014-03-17T06:47:07.247 に答える
0

AngularJS Materialディレクティブなしでライブラリを使用して構築された単純な軽量ソリューション。ユーザーがlistViewをクリックすると、コンテナーのレイアウトはcolumn折り返しなしになり、ユーザーが をクリックすると、行折り返しgridViewありになります。row

'use strict';
const application = angular.module("application", ['ngMaterial']);
application.controller('applicationCtrl', ['$scope', function(scope) {
  scope.toggleGridList = function(newValue) {
    if (newValue === "gridView") {
      scope.value = 'gridView';
      scope.layout = 'row';
    } else {
      scope.value = 'listView';
      scope.layout = 'column';
    }
  };
  scope.onInit = function() {
    scope.toggleGridList('listView');
  };
}]);
.grid-list-toggle {
  padding: 0 !important;
  margin: 8px;
  border-radius: 2px;
  border: 1px solid #c8e6c9;
}

.grid-list-button {
  margin: 0 !important;
  min-width: 0 !important;
  min-height: 0 !important;
  border-radius: 0 !important;
}

.grid-list-button.selected {
  background-color: #c8e6c9;
}
<head>
  <link rel="stylesheet" href="https://material.angularjs.org/1.1.24/angular-material.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.8.0/angular.min.js"></script>
  <script src="https://code.angularjs.org/1.8.0/angular-animate.min.js"></script>
  <script src="https://code.angularjs.org/1.8.0/angular-aria.min.js"></script>
  <script src="https://material.angularjs.org/1.1.24/angular-material.min.js"></script>
</head>

<body ng-app="application" ng-controller="applicationCtrl"
      ng-init="onInit();" class="ng-cloak" style="overflow: hidden;">
  <!-- Header -->
  <div layout="row" md-whiteframe="1" layout-align="start center">
    <!-- Title -->
    <div layout-padding>
      <span class="md-display-1" style="color: #1b5e20;">Grid-list toggle button</span>
    </div>
    <!-- Divider -->
    <div flex></div>
    <!-- Grid-list toggle button -->
    <div layout="row" layout-padding class="grid-list-toggle">
      <md-button class="grid-list-button" ng-click="toggleGridList('listView')"
          aria-label="List" ng-class="value == 'listView' ? 'selected' : ''">
        <div style="height: 30px">
          <img src="https://i.stack.imgur.com/SOqYv.png">
        </div>
      </md-button>
      <md-button class="grid-list-button" ng-click="toggleGridList('gridView')"
          aria-label="Grid" ng-class="value == 'gridView' ? 'selected' : ''">
        <div style="height: 30px">
          <img src="https://i.stack.imgur.com/STQJn.png">
        </div>
      </md-button>
    </div>
  </div>
  <!-- Page content -->
  <div flex="100" layout="column" md-whiteframe="1">
    <div layout="{{layout}}" layout-padding style="overflow-y: auto;"
        ng-class="value == 'gridView' ? 'layout-wrap' : 'layout-nowrap'">
      <div layout="row" layout-padding layout-align="start center" class="grid-list-toggle"
          ng-repeat="number in [].constructor(10) track by $index">
        <img src="https://i.stack.imgur.com/WANVK.png">
        <div layout="column">
          <span>Title {{$index}}</span>
          <span>Description</span>
          <span>Another line</span>
        </div>
      </div>
    </div>
  </div>
</body>


参照: «グリッドリスト切り替えボタン».

于 2020-08-21T19:37:52.937 に答える