user75486
user75486

Reputation: 1

How to get object from ng-repeat using angular.fromJson()

If I use the ng-option I can get from the select value an object, But, If I use the ng-repeat on option directive I can get just string. I am trying to convert string from ng-repeat to object with angular.fromJson() but I failed: my code is:

<!DOCTYPE html>
<html>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
<body>

<div ng-app="myApp" ng-controller="myCtrl">

<p>Select a car:</p>

<select ng-model="selectedCar">
<option ng-repeat="(x, y) in cars" value="{{y}}">{{y.brand}}</option>
</select>

<input type="text" value="{{selectedCar}}">
<h1>You selected: {{selectedCarObj.brand}}</h1>
<h2>Model: {{selectedCarObj.model}}</h2>
<h3>Color: {{selectedCarObj.color}}</h3>

<h1>You selected: {{selectedCar}}</h1>
<h2>Model: {{selectedCar}}</h2>
<h3>Color: {{selectedCar}}</h3>

<p>The visible text inside the dropdown list can also be a property of the value object.</p>

</div>

<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
    $scope.cars = {
        car01 : {brand : "Ford", model : "Mustang", color : "red"},
        car02 : {brand : "Fiat", model : "500", color : "white"},
        car03 : {brand : "Volvo", model : "XC90", color : "black"}
    }
    $scope.selectedCarObj = angular.fromJson($scope.selectedCar);
});
</script>

</body>
</html>

if I change the line:

$scope.selectedCarObj = angular.fromJson($scope.selectedCar);

To:

$scope.selectedCarObj = angular.fromJson({brand : "Ford", model : "Mustang", color : "red"});

It is working!

Why I cant get the {{selectedCarObj.brand }} value?

on the select lis the option value is :

<option ng-repeat="(x, y) in cars" value="{"brand":";Fiat";,";model":"500","color":"white"}" class="ng-binding ng-scope">Fiat</option><!-- end ngRepeat: (x, y) in cars -->

Can someone help me to understand why it is not working?

Maybe html caharacters?!?

Thank s lot.

Upvotes: 0

Views: 503

Answers (2)

Sachila Ranawaka
Sachila Ranawaka

Reputation: 41417

another alternative solution is to create a custom filter to convert the string to object and return the relevant property

app.filter('jsonFilt',function(){
  return function(item,name){
     if(item){
       item = JSON.parse(item);
       return item[name];
     } 
  }
});

call the filter in the html like this

<input type="text" value="{{selectedCar}}">
<h1>You selected: {{selectedCar | jsonFilt : 'brand'}}</h1>
<h2>Model: {{selectedCar | jsonFilt : 'model'}}</h2>
<h3>Color: {{selectedCar | jsonFilt : 'color'}}</h3>

Demo

var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
    $scope.cars = {
        car01 : {brand : "Ford", model : "Mustang", color : "red"},
        car02 : {brand : "Fiat", model : "500", color : "white"},
        car03 : {brand : "Volvo", model : "XC90", color : "black"}
    }
    $scope.selectedCarObj = angular.fromJson($scope.selectedCar);
});
app.filter('jsonFilt',function(){
  return function(item,name){
     if(item){
       item = JSON.parse(item);
       return item[name];
     } 
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="myApp" ng-controller="myCtrl">

<p>Select a car:</p>

<select ng-model="selectedCar">
<option ng-repeat="(x, y) in cars" value="{{y}}">{{y.brand}}</option>
</select>

<input type="text" value="{{selectedCar}}">
<h1>You selected: {{selectedCar | jsonFilt : 'brand'}}</h1>
<h2>Model: {{selectedCar | jsonFilt : 'model'}}</h2>
<h3>Color: {{selectedCar | jsonFilt : 'color'}}</h3>

<h1>You selected: {{selectedCar}}</h1>
<h2>Model: {{selectedCar}}</h2>
<h3>Color: {{selectedCar}}</h3>

<p>The visible text inside the dropdown list can also be a property of the value object.</p>

</div>

Upvotes: 0

Jenny
Jenny

Reputation: 663

You are missing ng-change :

var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
    $scope.cars = {
        car01 : {brand : "Ford", model : "Mustang", color : "red"},
        car02 : {brand : "Fiat", model : "500", color : "white"},
        car03 : {brand : "Volvo", model : "XC90", color : "black"}
    }
    $scope.GetObject = function(){
    $scope.selectedCarObj = angular.fromJson($scope.selectedCar);
    
}
});
<html>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
<body>

<div ng-app="myApp" ng-controller="myCtrl">

<p>Select a car:</p>

<select ng-model="selectedCar" ng-change="GetObject()">
<option ng-repeat="(x, y) in cars" value="{{y}}">{{y.brand}}</option>
</select>

<input type="text" value="{{selectedCar}}">
<h3>Json: {{selectedCar}}</h3>
object is :
<h3>brand: {{selectedCarObj.brand}}</h3>
<h3>model: {{selectedCarObj.model}}</h3>
<h3>color: {{selectedCarObj.color}}</h3>

<p>The visible text inside the dropdown list can also be a property of the value object.</p>

</div>
</body>
</html>

Upvotes: 1

Related Questions