<div ng-app="myApp" ng-controller="Ctrl as ctrl">
<!-- iterate over preferences -->
<div class="values" ng-repeat="(key, value) in ctrl.userPreferences.theme">
<span>{{ key }}:</span>
<span>{{ value }}</span>
<!-- use mapping along with ng-switch to find out what template to use -->
<div ng-switch="ctrl.mapping[key]">
<!-- boolean -->
<div ng-switch-when="boolean">
<select ng-options="bool for bool in [true, false]" ng-model="ctrl.userPreferences.theme[key]"></select>
</div>
<!-- dropdown -->
<div ng-switch-when="dropdown">
<!-- check for possible pref values if they exist -->
<div ng-if="!!ctrl.preferenceValues[key]">
<select ng-options="prefVals for prefVals in ctrl.preferenceValues[key]" ng-model="ctrl.userPreferences.theme[key]"></select>
</div>
<div ng-if="!ctrl.preferenceValues[key]">
NO VALUES EXIST FOR THIS DROPDOWN!
</div>
</div>
<!-- slider -->
<div ng-switch-when="slider">
<input type ="range"
ng-model="ctrl.userPreferences.theme[key]"
min ="{{ctrl.preferenceValues[key].min}}"
max="{{ctrl.preferenceValues[key].max}}"
step ="1"
value ="ctrl.userPreferences.theme[key]" />
</div>
<!-- textbox -->
<div ng-switch-when="textbox">
<input type="text"
ng-model="ctrl.userPreferences.theme[key]"
/>
</div>
<div ng-switch-default>
<span>{{ value }}</span>
</div>
</div>
</div>
</div>