Search code examples
angularjschecklist-model

AngularJS checkbox checking when in ng-repeat


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


Solution

  • 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>