AngularJS checkbox checking when in ng-repeat
Asked Answered
P

4

8

I know the solution is not very pretty, but it's needed for the template I'm working in.

Now it works, and it shows me the "Added" span-element when the products was in the list.

<section ng-repeat="product in products">
    <label>
        <input type="checkbox" 
            checklist-model="foobar.products" 
            checklist-value="product.id">
        {{ product.name }}
    </label>

    <div ng-repeat="current_item in my.profile.items">
        <span ng-show="product.id==current_item.id">Added</span>
    </div>
</section>

What I want, it to check the checkbox to checked, when the "Added" text also appeared behind the checkbox.

I tried doing it with:

<ng-checked="{{my.profile.items.array.thing}}">

But that's not working. Because the products in an Array like:

[{       
    id: 1, name:"Trinity",
    id: 2, name:"Van Gogh",
    id: 3, name:"Bonaqua",
}]

And the my.profile.items is an array with more info then above. Because it's a many-to-many relation where I stored it.

Is there even a way to do this? I don't mind a dirty solution :P

I tried this:

// NG-check function
$scope.checkStoredValues = function(my) {

    // Loop trought my current stored items
    angular.forEach(my.profile.items, function(value, key) {

        // Loop trough the array    
        angular.forEach(value, function(value, key) {
            console.error(key);

            // If key == 'id'
            if(key == 'id'){
                // Push the value to the Array of the checkboxes,
                // so it's checked 
                // # Docs: http://vitalets.github.io/checklist-model/
                console.info(value); // Return's: integer 
                foobar.products.push(value); // Needs more then an integer I guess..

            }
        });
    });

};

This returns: TypeError: Cannot read property 'push' of undefined

Prue answered 20/8, 2015 at 19:7 Comment(3)
Why you override value, key variables in $scope.checkStoredValuesAmon
first off, you get TypeError because foobar.products is undefined, you need to define it as array. second off have you checked all examples on vitalets.github.io/checklist-model ?Edan
Can you provide the plnkr or jsfiddle for the same?Unopened
A
10

Add this function to your controller:

$scope.isChecked = function(product) {
  var items = $scope.my.profile.items;
  for (var i=0; i < items.length; i++) {
    if (product.id == items[i].id)
      return true;
  }

  return false;
};

And for your html use

<section ng-repeat="product in products">
    <label>
        <input type="checkbox" 
               ng-checked="isChecked(product)">
        {{ product.name }}
    </label>

    <div ng-repeat="current_item in my.profile.items">
        <span ng-show="product.id==current_item.id">Added</span>
    </div>
</section>
Animate answered 22/8, 2015 at 20:9 Comment(0)
U
4

Another trick that you can do is create a view model specific for your need.

So for example you have the array of products and items within the profile.

In the controller, you could do something like:

 $scope.products.forEach(function(p){
       var items = $scope.my.profile.items;
       var wasAdded = false;
       for (var i=0; i < items.length; i++) {
           if (product.id == items[i].id)
                 wasAdded =  true;
                 i = items.length;
        }
       $scope.productsViewModels.push({product:p, added:wasAdded});
 });

Now that you have created your data as needed in the view, then you can simple do:

 <section ng-repeat="p in productsViewModels">
     <label>
         <input type="checkbox" 
             ng-checked = "p.added"
             checklist-model="foobar.products" 
             checklist-value="p.product.id">
              {{ p.product.name }}
     </label>

     <span ng-show="p.added">Added</span>
 </section>

When I have combined data from multiple sources I prefer to process it before in the controller and create a viewModel that will makes my life easy in the view.

Upsweep answered 29/8, 2015 at 5:44 Comment(0)
B
2

you need to implement something like this AngularJs ng-checked using a function

you just need to implement your own logic based on your many to many product array and return true or false accordingly.

Bibliotaph answered 24/8, 2015 at 19:54 Comment(0)
G
0

Add this after the checkbox

<span ng-if="my.profile.items.indexOf(product) >= 0">added</span>

and remove the div.

Gusgusba answered 20/8, 2015 at 20:44 Comment(3)
Nope, not working and not the solution. I wanna have the checkbox checked. My code above works perfect, but I wanna have a <input type=checkbox ng-checked=true>Prue
Can you build an example on plunkr or jsfiddle? For me it works.Gusgusba
I know it works, but it's not the question ;-) I'll explain it more in a sec.Prue

© 2022 - 2024 — McMap. All rights reserved.