15

Ionic フレームワークを使用して、ラジオ ボタンとして機能する 3 つのボタンのグループを作成しようとしています。

ボタングループ画像

[朝食] をクリックすると、[昼食] と [夕食] が通常の (白) 状態に戻り、[朝食] が青に変わります。

現在のコードでは、この機能を動作させることはできませんが、ボタンの色を少しランダムに切り替えることはできます (おそらく、ng-classディレクティブを理解していないだけです)。

ここに私のHTMLコードがあります:

<div class="bar bar-subheader">
 <div class="button-bar">
   <a class="button" ng-class="{'button-positive' : !isActiveB, 'none': isActiveB}" ng-click="active('breakfast')">Breakfast</a>
   <a class="button" ng-class="{'button-positive' : !isActiveL, 'none': isActiveL}" ng-click="active('lunch')">Lunch</a>
   <a class="button" ng-class="{'button-positive' : !isActiveD, 'none': isActiveD}" ng-click="active('dinner')">Dinner</a>
 </div>
</div>

私のJS:

$scope.active = function(meal) {

 switch (meal) {
   case 'breakfast':
     $scope.$broadcast('slideBox.setSlide', 0);
     $scope.isActiveB = $scope.isActiveB;
     $scope.isActiveL = !$scope.isActiveL;
     $scope.isActiveD = !$scope.isActiveD;
     break;
   case 'lunch':
     $scope.$broadcast('slideBox.setSlide', 1);
     $scope.isActiveB = !$scope.isActiveB;
     $scope.isActiveL = $scope.isActiveL;
     $scope.isActiveD = !$scope.isActiveD;
     break;
   case 'dinner':
     $scope.$broadcast('slideBox.setSlide', 2);
     $scope.isActiveB = !$scope.isActiveB;
     $scope.isActiveL = !$scope.isActiveL;
     $scope.isActiveD = $scope.isActiveD;
     break;
 }
};

より多くの情報と実用的なソリューションが必要な場合は、コードを JSFidle に入れることができます。

ご協力いただきありがとうございます。


注: この関数に依存する他の多くのコードがあるため、active()関数を維持し、ng-class可能であればディレクティブを使用したいと考えています。

4

3 に答える 3

26

おそらく、この単純化された例が少し役立つでしょう:

angular.module('plunker', []).controller('MainCtrl', function($scope) {
    $scope.active = 'breakfast';
    $scope.setActive = function(type) {
        $scope.active = type;
    };
    $scope.isActive = function(type) {
        return type === $scope.active;
    };
});
<link rel="stylesheet" href="http://code.ionicframework.com/0.9.26/css/ionic.min.css">
<script src="http://code.angularjs.org/1.2.13/angular.js"></script>

<div ng-app="plunker" ng-controller="MainCtrl" class="bar bar-subheader">
    <div class="button-bar">
        <a class="button" ng-class="{'button-positive': isActive('breakfast')}" ng-click="setActive('breakfast')">Breakfast</a>
        <a class="button" ng-class="{'button-positive': isActive('lunch')}" ng-click="setActive('lunch')">Lunch</a>
        <a class="button" ng-class="{'button-positive': isActive('dinner')}" ng-click="setActive('dinner')">Dinner</a>
    </div>
</div>

デモ: http://plnkr.co/edit/9HmuTStz70x5KoAvLaP4?p=preview

于 2014-03-07T19:26:00.483 に答える
0

ここでは、他の 2 つを組み合わせた別の代替アプローチを示します。次の属性を持つ <button-group> 要素が 1 つだけ必要です。

  • ng-モデル
  • ボタン - 'text' および 'value' プロパティを含むオブジェクトの配列
  • button-class - デフォルトの「group-btn」および「group-btn-active」クラスに加えて、レンダリングされたリンクに適用する CSS クラスを含むオプションの文字列

.

.directive('buttonGroup',function($parse){
    return {
        restrict: 'E',
        require: 'ngModel',
        scope: {
          model: '=ngModel',
          buttons: '=',
          buttonClass: '='
        },
        template: '<a class="group-btn {{buttonClass}}" ' +
                  '   ng-repeat="button in buttons" ' +
                  '   ng-class="{\'group-btn-active\': isActive(button.value)}" ' +
                  '   ng-click="buttonClicked(button.value)"> ' +
                  '       {{button.text}} ' +
                  '</a>',
        controller: ['$scope', function($scope) {
            $scope.buttonClicked = function(value) {
                $scope.value = value;
            };
            $scope.isActive = function(value) {
                return $scope.value === value;
            };
        }],
        link: function(scope, element, attrs, ngModel) {
            element.on('click', function(e){
                scope.$apply(function(){
                    ngModel.$setViewValue(scope.value);
                });
            });

            scope.$watch('model', function(newVal){
                scope.value = newVal;
            });
        }
    };
})

そして使用例:

<button-group ng-model="sortOrder" buttons="sortOptions" 
    button-class="'md-button my-other-class'"></button-group>

ここで、sortOptions は次の形式の配列になります。

$scope.sortOptions = [
        { value: 'priority', text: 'Priority' },
        { value: 'duration', text: 'Call Duration' }
    ];
于 2016-03-23T23:47:47.897 に答える