0

I'm having trouble binding my default value to a ng-option. I already searched for the answer to my question but can't seem to find one.

My problem is that I have 3 cascading selects with one model.

default values

vm.roomData.branch = 'Lucena';
vm.roomData.building = 'mhq';
vm.roomData.roomFloor = '3rd Floor';

html

<div class="col-md-4">
    <label for="branch">
        <strong>Branch</strong>
    </label>
    <select ng-options="loc as loc.branch for loc in vm.locations" class="form-control" ng-model="vm.roomData.branch">
    </select>
    <small id="emailHelp" class="form-text text-muted">Select branch.</small>
</div>
<div class="col-md-4">
    <label for="building">
        <strong>Building</strong>
    </label>
    <select ng-options="loc as loc.name for loc in vm.roomData.branch.building" ng-model="vm.roomData.building" class="form-control">
    </select>
</div>
<div class="col-md-4">
    <label for="roomFloor">
        <strong>Room Floor</strong>
    </label>
    <select ng-options="loc.floors as loc for loc in vm.roomData.building.floors" ng-model="vm.roomData.roomFloor" class="form-control">
    </select>
</div>

vm.locations data

[
{
    "_id": "5a681380b7c41e7df2076819",
    "branch": "Lucena",
    "__v": 0,
    "building": [
        {
            "name": "MHQ",
            "floors": [
                "Ground Floor",
                "2nd Floor",
                "3rd Floor"
            ]
        }
    ],
    "dateCreated": "2018-01-24T05:02:56.465Z"
},
{
    "_id": "5a681aecb7c41e7df207681d",
    "branch": "Lucban",
    "__v": 0,
    "building": [
        {
            "name": "MHQ1",
            "floors": [
                "ground floor",
                "2nd floor"
            ]
        }
    ],
    "dateCreated": "2018-01-24T05:34:36.775Z"
}]
2
  • I'm a little confused as to what is going on there but you shouldn't expect vm.roomData.branch.building to be anything because branch doesn't have any property called building unless I'm missing something. Also it would be less confusing if you didn't call everything loc. Commented Jan 24, 2018 at 6:27
  • @PixMach actually its working problem is that I'm having trouble binding a default value. This is for my edit location page so i really need to bind the default value. I'm sorry that my explanation is like this im not really good at explaining in english. Commented Jan 24, 2018 at 6:36

1 Answer 1

2

try initializing the default values like this,

   $scope.roomData.branch = $scope.locations.find((loc) => loc.branch === 'Lucena'); 
   $scope.roomData.building = $scope.roomData.branch.building.find((br) => br.name.toLowerCase() == 'mhq');
   $scope.roomData.roomFloor = '3rd Floor' ;

like

var app = angular.module('testApp', []);
app.controller('testCtrl', function($scope) {
  var vm = this;
  vm.roomData = {};
  vm.locations = [{
      "_id": "5a681380b7c41e7df2076819",
      "branch": "Lucena",
      "__v": 0,
      "building": [{
        "name": "MHQ",
        "floors": [
          "Ground Floor",
          "2nd Floor",
          "3rd Floor"
        ]
      }],
      "dateCreated": "2018-01-24T05:02:56.465Z"
    },
    {
      "_id": "5a681aecb7c41e7df207681d",
      "branch": "Lucban",
      "__v": 0,
      "building": [{
        "name": "MHQ1",
        "floors": [
          "ground floor",
          "2nd floor"
        ]
      }],
      "dateCreated": "2018-01-24T05:34:36.775Z"
    }
  ];

  vm.roomData.branch = vm.locations.find((loc) => loc.branch === 'Lucena'); debugger
  vm.roomData.building = vm.roomData.branch.building.find((br) => br.name.toLowerCase() == 'mhq');
  vm.roomData.roomFloor = '3rd Floor' ;
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<body ng-app="testApp" ng-controller="testCtrl as vm">
  <div class="col-md-4">
    <label for="branch">
        <strong>Branch</strong>
    </label>
    <select ng-options="loc as loc.branch for loc in vm.locations" class="form-control" ng-model="vm.roomData.branch">
    </select>
    <small id="emailHelp" class="form-text text-muted">Select branch.</small>
</div>
<div class="col-md-4">
    <label for="building">
        <strong>Building</strong>
    </label>
    <select ng-options="loc as loc.name for loc in vm.roomData.branch.building" ng-model="vm.roomData.building" class="form-control">
    </select>
</div>
<div class="col-md-4">
    <label for="roomFloor">
        <strong>Room Floor</strong>
    </label>
    <select ng-options="o as o for o in vm.roomData.building.floors" ng-model="vm.roomData.roomFloor" class="form-control">
    </select>
</div>
</body>

Sign up to request clarification or add additional context in comments.

2 Comments

Thank you very much man. Can you also make it that if select a branch the building and room floor will remove their value ? cheers thanks again.
you can use ng-change like ` ng-change="vm.roomData.building = ''; vm.roomData.roomFloor = '';"`

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.