Mad-D
Mad-D

Reputation: 4669

ng-repeat and user selected value in angular data binding

I have three layer json parent-child object ( Persons > Projectors > Model ). When user clicks on one of the Projector i would like to capture that value and list Model belongs to only that Projector.

HTML

<div ng-app="myApp" ng-controller="MyController">
<h4>
  Two Way Data Bind
</h4>
<lable style="color:green"> The value you picked (JSON): </lable>
{{value.val}}

</br>
<div close-others="oneAtATime">
  <uib-accordion-group ng-repeat="num in list">
      <uib-accordion-heading>
          {{ num.Title }}                                 
      </uib-accordion-heading>
        <div class="list-group"> 
          <a href="#" ng-repeat="oum in num.Projectors" ng-model="num" ng-click="value.val=num">
            <li> {{ oum.Projector }} </li>
          </a>
        </div>
  </uib-accordion-group>

  <h4>
  Listing all Models for picket Projector {{num}}: </h4>

  <uib-accordion-group ng-repeat="first in value">
    <uib-accordion-group ng-repeat="second in first.Projectors">
           {{second.Model}}
    </uib-accordion-group>
  </uib-accordion-group>

 </div>
</div>

APP.JS

angular.module('myApp', [])
    .controller('MyController', function($scope){
      $scope.value = {val:"TEST"};
      $scope.filterBy = {};

      $scope.list = [{
            "Title":"King",
          "BossName":[
                {
                    "User": "TestUSer",
                    "Name": "TestName"
                }
            ],
           "Projectors":[
                {
                    "Projector": "TestParam",
                    "Type": [
                        {
                            "Name": "TestVI"
                        }
                    ],
                    "Model": [
                        {
                            "Service": "TestSev",
                            "Notification": "TestNot"
                        }
                    ]
                },
                {
                    "Projector": "TestHouse",
                    "Type": [
                        {
                            "Name": "TestI"
                        }
                    ],
                    "Model": [
                        {
                            "Service": "TestCri",
                            "Notification": "TestOk"
                        }
                    ]
                }
             ] 
      },
      {
            "Title":"Queen",
          "BossName":[
                {
                    "User": "Liz",
                    "Name": "Nothing"
                }
            ],
           "Projectors":[
                {
                    "Projector": "PTestParam",
                    "Type": [
                        {
                            "Name": "TestVI"
                        }
                    ],
                    "Model": [
                        {
                            "Service": "TestSev",
                            "Notification": "TestNot"
                        }
                    ]
                },
                {
                    "Projector": "PTestHouse",
                    "Type": [
                        {
                            "Name": "TestI"
                        }
                    ],
                    "Model": [
                        {
                            "Service": "TestCri",
                            "Notification": "TestOk"
                        }
                    ],
                    "Model": [
                        {
                            "Service": "3TestCri",
                            "Notification": "3TestOk"
                        }
                    ]
                }
             ] 
      }
      ];

});

Problem: 1. How to capture user clicked/ picked value ? I tried data binding using ng-model on that tag but didn't work for me. 2. Now when i click on any Projector, it also list Model value for other Projector.

Demo: JFiddle

Upvotes: 1

Views: 306

Answers (2)

Naga Sandeep
Naga Sandeep

Reputation: 1431

1) It looks like your json is slightly wrong. It is having 2 projector model's for the last projector. Normally it should be something like

                     "Models":[
                          {
                              "Service": "TestCri",
                              "Notification": "TestOk"
                          },
                          {
                              "Service": "Test43Cri",
                              "Notification": "TestNotOk"
                          }
                      ]

And then we access them in the markup as

<uib-accordion-group ng-repeat="model in value.val.Models">
       {{model}}
</uib-accordion-group>

2) Listing all Models for picket Projector {{num}}: may not display any value for you because num will be created in the scope of ng-repeat. ng-repeat uses it's own scope. So you have to use value.val which is created in the controller's scope

3) Once you make the above changes, you dont need

<uib-accordion-group ng-repeat="first in value">

4) <br> is correct way. </br> is wrong way. It is a self closing tag.

So, your markup will be something like

<div ng-app="myApp" ng-controller="MyController">
<h4>
  Two Way Data Bind
</h4>
<lable style="color:green"> The value you picked (JSON): </lable>
{{value.val}}

<br>
<div close-others="oneAtATime">
  <uib-accordion-group ng-repeat="num in list">
      <uib-accordion-heading>
          {{ num.Title }}                                 
      </uib-accordion-heading>
        <div class="list-group"> 
          <a href="#" ng-repeat="oum in num.Projectors" ng-model="oum" ng-click="value.val=oum">
            <li> {{ oum.Projector }} </li>
          </a>
        </div>
  </uib-accordion-group>

  <h4>
  Listing all Models for picket Projector: </h4>
    <uib-accordion-group ng-repeat="model in value.val.Models">
           {{model}}
    </uib-accordion-group>
 </div>
</div>

and your js will be something like

angular.module('myApp', [])
    .controller('MyController', function($scope){
      $scope.value = {val:"TEST"};
      $scope.filterBy = {};

      $scope.list = [{
            "Title":"King",
          "BossName":[
                {
                    "User": "TestUSer",
                    "Name": "TestName"
                }
            ],
           "Projectors":[
                {
                    "Projector": "TestParam",
                    "Type": [
                        {
                            "Name": "TestVI"
                        }
                    ],
                     "Models":[
                        {
                            "Service": "TestSev",
                            "Notification": "TestNot"
                        }
                    ]
                },
                {
                    "Projector": "TestHouse",
                    "Type": [
                        {
                            "Name": "TestI"
                        }
                    ],
                     "Models":[
                        {
                            "Service": "TestCri",
                            "Notification": "TestOk"
                        }
                    ]
                }
             ] 
      },
      {
            "Title":"Queen",
          "BossName":[
                {
                    "User": "Liz",
                    "Name": "Nothing"
                }
            ],
           "Projectors":[
                {
                    "Projector": "PTestParam",
                    "Type": [
                        {
                            "Name": "TestVI"
                        }
                    ],
                     "Models":[
                        {
                            "Service": "TestSev",
                            "Notification": "TestNots"
                        }
                    ]
                },
                {
                    "Projector": "PTestHouse",
                    "Type": [
                        {
                            "Name": "TestI"
                        }
                    ],
                    "Models":[
                          {
                              "Service": "TestCri",
                              "Notification": "TestOk"
                          },
                          {
                              "Service": "Test43Cri",
                              "Notification": "TestNotOk"
                          }
                      ]
                }
             ] 
      }
      ];

});

Demo here Cheers.

Upvotes: 1

Judson Terrell
Judson Terrell

Reputation: 4306

I have updated your fiddle. First you are using the ng-click on a parent element where you really need it on the li tag so that you can pass the index of the child (oum) and the parent (num) to a function that will return the position in the list object like so...

first change to your list group:

<div class="list-group"> 
     <ul ng-repeat="oum in num.Projectors" ng-model="num" >
         <li><a href="#" ng-click="showMe($parent.$index, $index)"> {{ oum.Projector }}</a></li>
      </ul>
</div>

Then in your controller...

$scope.showMe = function(parent,child){      
  $scope.value.val = $scope.list[parent].Projectors[child];      
 }

I have updated your fiddle: https://jsfiddle.net/at6pdhrv/10/

Upvotes: 0

Related Questions