Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to bind ng-model to ng-checked boxes

Tags:

angularjs

I am having a problem binding Angular ng-check to ng-model, that is ng-model does do not recognize the selected state of my check boxes.

Here is a description(Its a much larger code base but I have tailored to minimize code).

On page load in JavaScript I initialize my products and set the default values:

$scope.products = {}
$scope.SetProductsData = function() {
    var allProducts;
    allProducts = [
      {
        id: 1,
        name: "Book",
        selected: true
      }, {
        id: 2,
        name: "Toy",
        selected: true
      }, {
        id: 3,
        name: "Phone",
        selected: true
      }]

I have a master control in my view that list a check box for each 3 products(Book,Toy and phone):These are checked by default

<div style="float:left" ng-init="allProducts.products = {}" >
    <div ng-repeat="p in Data.products">
        <div style="font-size: smaller">
            <label><input id="divPlatorm"  ng-model="products[p.name]" ng-init="products[p.name] = true" type="checkbox"/>
                {{p.name}}</label>
        </div>
    </div>
</div>

Then a table that have the same products repeated in rows:

<div ng-repeat="line in lineProducts" ng-init="line.products = {}">
    <div id="sc-p-enc" ng-repeat="p in Data.products">
        <div id="sc-p-plat" style="font-size: smaller">
            <label id="pl-label"><input ng-checked="products[p.name]"  ng-model="line.products[p.name]"  ng-init="line.products[p.name] = true" type="checkbox"/>                                    
                {{p.name}}</label>
        </div>
    </div>
</div>

When I check/unchecked the master products the corresponding check boxes changes in the rows. So if I have 100 rows with (Book,Toy and phone) the unchecked Toy I can see where all toys are unchecked in the rows.

When I send the data to my controller I can still see all Toys = true even though they were unchecked.

If I physically go to the row then unchecked each toy and send the data to my controller Toys = False.

How can I get the check boxes selected state to change when controlled from the master check-boxes?

I have followed the post found here but I dont think this applies to my scenario: AngularJS: ng-model not binding to ng-checked for checkboxes

like image 566
Milligran Avatar asked Oct 02 '13 17:10

Milligran


2 Answers

It seems the ng-checked in the table is binding to products[p.name], which the ng-model in your master control in the view also binding to. But the ng-model in your table is binding to another property, line.products[p.name].

I think you probably don't need ng-checked in the table since each item has its own ng-model. So you might change your table view to

<label id="pl-label"><input ng-model="line.products[p.name]" type="checkbox"/>{{p.name}}</label>

and in the controller, change the corresponding value of line.products[p.name] every time the value of products[p.name] is changed.

like image 76
Ethan Wu Avatar answered Oct 20 '22 21:10

Ethan Wu


I just solved this problem myself by using "ng-init" and "ng-checked" ---

  • ng-checked - 'checked' the checkbox as form was loaded
  • ng-init- bound my checkbox html value attribute to the model

There is a comment above stating that its not good to use ng-init in this manner, but not other solution was provided.

Here is an example using ng-select instead of ng-checked:

<select ng-model="formData.country"> 
<option value="US" ng-init="formData.country='US'" ng-selected="true">United States</option>
</select>

This binds "US" to model formData.country and selects the value on page load.

like image 32
Don F Avatar answered Oct 20 '22 20:10

Don F