Angularjs Select values are getting removed from ngModel after being added programmicatically

328 Views Asked by At

I am using Angularjs with select2. I have a multiselect box that gets populated based off the values selected in another dropdown. I use an click event on a button for fire a method that adds a list of ids to the ngModel object assigned to the multiselect box. I can see the values getting added properly after I trigger a change event on that form element because even after reading articles and changing the ngModel value to be a object and not an array, the values still aren't binding when I add them programmatically. After I trigger the change event on the form element, I am able to see some of the values but not all of them. Some of the values were removed. Below is my code.

addRecord.vm

<div class="col-sm-4">
    <select ui-select2="{ allowClear: false, minimumResultsForSearch: 10, theme: bootstrap }"
        name="recordTemplate" ng-model="addRecordCtrl.selectedTemplate">
        <option class="selectPlaceholder" value="" disabled selected hidden>- Chose Record Template -</option>
        <option ng-repeat="template in addRecordCtrl.recordTemplates" value="{{record.name}}">{{record.name}}</option>
    </select>
</div>

    <div class="col-sm-9">
      <button id="addButton" class="btn btn-primary btn-lg" ng-click="addRecordCtrl.addRecords()" ng-disabled="addRecordCtrl.isLoading 
|| addRecordCtrl.isEdit">Add</button>
 </div>

<div class="col-lg-9 col-xs-9" id="recordContainer" name="recordContainer">
     <select ui-select2="{ allowClear: false, minimumResultsForSearch: Infinity}"
         name="records" id="records" class="medium"
         multiple ng-model="addRecordCtrl.records.id"
         ng-required="true" ng-cloak>
             <option ng-repeat="record in addRecordCtrl.availableRecords | notInArray:addRecordCtrl.selectedRecordIds.ids:'recordId'"
                value="{{record.recordId}}">{{record.name}}</option>
    </select>
    <input type="hidden" ng-model="addRecordCtrl.selectedRecordName" value="">
</div>

app.js

recordApp.controller('RecordController', ['$http', '$window', '$modal', '$log','$filter', '$timeout', function ($http, $window, $modal, $log, $filter, $timeout) {

    var self = this;
    self.availableRecords = [{
        recordId: "1",
        name: "Love and Happiness"
    },{
        recordId: "2",
        name: "Feel the Burn"
    },{
        recordId: "3",
        name: "Juicy Baby"
    }];
    self.recordTemplates = null;
    self.selectedRecordIds = {};

    self.addRecords = function () {

        //add record ids from the selected records.
        self.recordTemplates.recordId.forEach(function (id) {
            self.selectedRecordIds.ids.push(id.recordId);
        });

        self.recordAdded = true;
    };

}]);
//filter to filter out ids that have already been selected.
recordsApp.filter('notInArray', ['$filter', function($filter){
    return function(list, arrayFilter, element){
        if(arrayFilter){
            return $filter("filter")(list, function(listItem){
                for (var i = 0; i < arrayFilter.length; i++) {
                    if (arrayFilter[i][element] == listItem[element])
                        return false;
                }
                return true;
            });
        }
    };
}]);
1

There are 1 best solutions below

0
androgirl On BEST ANSWER

The reason some of my values were getting deleted from the selectedRecordIds array after adding them programmatically was because they are not in the availableRecords array. Once I made sure those values where in the availableRecords array all was well.