Gilberto Quintero
Gilberto Quintero

Reputation: 397

Filter dropdown with ng-options from ng-options selection

I am trying to filter an ng-options dropdown depending of what you select in the previous one. This is what I am trying to achieve

If you choose Internal Tier 1 then show all Branding Tiers

If you choose Internal Tier 2 show all Branding Tiers > 1

If you choose Internal Tier 3 show Branding Tier 3b

This is my actual code.

$scope.lookUps = {
    companyTier: [
        { Id: 1, Name: '1 - Partner Branded'},
        { Id: 2, Name: '2 - Co-branded'},
        { Id: 3, Name: '3a - Answer Branded'},
        { Id: 4, Name: '3b - Answer Branded'}
    ],
    internalTier: [
        { Id: 1, Name: 'Tier 1' },
        { Id: 2, Name: 'Tier 2' },
        { Id: 3, Name: 'Tier 3' }
    ]
};

And these are the dropdowns

<select class="form-control" name="companyinternaltier" 
ng-required="true" ng-model="companyData.InternalTierId" 
ng-options="item.Id as item.Name for item in lookUps.internalTier">          
<option value="">- Select Internal Tier Level -</option>

<select class="form-control" name="companytier" ng-required="true" 
ng-model="companyData.Category" ng-options="item.Id as item.Name for
item in lookUps.companyTier | filter: filterTiers()"> 
<option value="">- Select Branding Tier Level -</option></select>

I put filterTiers() function after the filter word because I think I could create a function to do that but I dont know how to handle it

I appreciate any kind of help. Thanks

Upvotes: 2

Views: 1758

Answers (3)

Walter GP
Walter GP

Reputation: 36

On:

<select class="form-control" name="companyinternaltier" 
ng-required="true" ng-model="companyData.InternalTierId" 
ng-options="item.Id as item.Name for item in lookUps.internalTier">          
<option value="">- Select Internal Tier Level -</option>

it seems that you already have where to store the selected value.

ng-model="companyData.InternalTierId"

What I'll do in the controller is:

First:

separate the companyTier's object:

companyTier: [
        { Id: 1, VisibilityRange: 1, Name: 'Partner Branded'},
        { Id: 2, VisibilityRange: 2, Name: 'Co-branded'},
        { Id: 3, VisibilityRange: 2, Name: 'Answer Branded'},
        { Id: 4, VisibilityRange: 3, Name: 'Answer Branded'}
    ]

Then:

Add the function to filter the objects.

$scope.filterTiers = function(companyTier) {
    return (companyTier.VisibilityRange >= companyData.InternalTierId );
};

Controller will look like this after changes:

$scope.lookUps = {
    companyTier: [
            { Id: 1, VisibilityRange: 1, Name: 'Partner Branded'},
            { Id: 2, VisibilityRange: 2, Name: 'Co-branded'},
            { Id: 3, VisibilityRange: 2, Name: 'Answer Branded'},
            { Id: 4, VisibilityRange: 3, Name: 'Answer Branded'}
        ],
    internalTier: [
        { Id: 1, Name: 'Tier 1' },
        { Id: 2, Name: 'Tier 2' },
        { Id: 3, Name: 'Tier 3' }
    ]
};

$scope.filterTiers = function(companyTier) {
    return (companyTier.VisibilityRange >= companyData.InternalTierId );
};

And the view something like this:

<select class="form-control" name="companyinternaltier" 
ng-required="true" ng-model="companyData.InternalTierId" 
ng-options="item.Id as item.Name for item in lookUps.internalTier">          
<option value="">- Select Internal Tier Level -</option></select>

<select class="form-control" name="companytier" ng-required="true" 
ng-model="companyData.Category" ng-options="item.Name for item in (lookUps.companyTier | filter: tierFilter)"> 
<option value="">- Select Branding Tier Level -</option></select>

Upvotes: 2

Loren
Loren

Reputation: 190

Here is a working JSFiddle using your code, which should match your requirement.

Hope this helps.

HTML

<div ng-controller="myController">

    <select 
        class="form-control" 
        name="companyinternaltier" 
        ng-required="true" 
        ng-model="companyData.InternalTierId" 
        ng-options="item.Id as item.Name for item in lookUps.internalTier"
    >
        <option ng-show="companyData.InternalTierId == 0"
        value="">- Select Internal Tier Level -</option>
    </select>

    <select 
        class="form-control" 
        name="companytier" 
        ng-required="true" 
        ng-model="companyData.Category" 
        ng-options="item.Id as item.Name for item in lookUps.companyTier | filterTiers:companyData.InternalTierId"
    >
        <option ng-show="companyData.Category == 0"
        value="">- Select Branding Tier Level -</option>
    </select>

</div>

JS

var myApp = angular.module('myApp', []);

myApp.controller('myController', function($scope) {

    $scope.companyData = {};
    $scope.companyData.Category = 0;
    $scope.companyData.InternalTierId = 0;

    $scope.lookUps = {
        companyTier: [
            { Id: 1, Name: '1 - Partner Branded'},
            { Id: 2, Name: '2 - Co-branded'},
            { Id: 3, Name: '3a - Answer Branded'},
            { Id: 4, Name: '3b - Answer Branded'}
        ],
        internalTier: [
            { Id: 1, Name: 'Tier 1' },
            { Id: 2, Name: 'Tier 2' },
            { Id: 3, Name: 'Tier 3' }
        ]
    };

});


myApp.filter('filterTiers', function() {
    return function(item, InternalTierId) {

        if (!item) {
            return null;
        }

        var arr = [];


        for (var i in item) {
            if (item[i].Id >= InternalTierId) {
                arr.push(item[i]);
            }
        }

        return arr;

    };
});

Upvotes: 1

AlphaG33k
AlphaG33k

Reputation: 1678

Here is the markup

 <div ng-app="soExample" ng-controller="dependantSelections" class="selections">
    <select ng-model="lookUps.companyTier" ng-options="selection.name for selection in lookUps.internalTier" ng-change="showTier(lookUps.companyTier)">
        <option value="">Please select a tier</option>
    </select>
    <select ng-model="lookUps.internalTier" ng-options="selection.name for selection in lookUps.internalTier | filter: lookUps.filter" ng-change="somethingElse(lookUps.companyTier)" ng-if="currentSelection">
        <option value="">Please select an option</option>
    </select>
  </div>

Here is the Angular

var soExample = angular.module('soExample', []);

soExample.controller('dependantSelections', function($scope) {
'use strict';

$scope.currentSelection = null;
$scope.lookUps = {
    companyTier: [{
        id: 1,
        group: 1,
        name: '1 - Partner Branded'
    }, {
        id: 2,
        group: 2,
        name: '2 - Co-branded'
    }, {
        id: 3,
        group: 3,
        name: '3a - Answer Branded'
    }, {
        id: 4,
        group: 3,
        name: '3b - Answer Branded'
    }],
    internalTier: [{
        id: 1,
        group: 1,
        name: 'Tier 1'
    }, {
        id: 2,
        group: 2,
        name: 'Tier 2'
    }, {
        id: 3,
        group: 3,
        name: 'Tier 3'
    }],
    filter: function(curTier) {
        return curTier === $scope.currentSelection;
    }
};

function showTier(tier) {
    $scope.currentSelection = tier;
}

function somethingElse(next) {
    alert(next.name)
}

$scope.showTier = showTier;

$scope.somethingElse = somethingElse;

});

Here is the live demo for your debugging pleasure ;)

http://codepen.io/nicholasabrams/pen/EKyJLX

Upvotes: 0

Related Questions