Search code examples
angularjsng-grid

Error: [ngModel:nonassign] Expression is non-assignable


Trying to display a columnvalue from a gridcollection based on another value in that same row. The user can select/change values in a modal which contains a grid with values. When the modal closes the values are passed back. At that moment I would like to set a value for 'Also known as':

html:

 Also known as: <input type="text" `ng-model="displayValue(displayNameData[0].show,displayNameData[0].value)">`

I created a function on scope to select the value only when the 'show' value is true:

$scope.displayValue = function (show, val) {
    if (show) {
        return val;
    }
    else {
        return '';
    }
}

However when I close the modal I get an error:

Error: [ngModel:nonassign] Expression 'displayValue(displayNameData[0].show,displayNameData[0].value)' is non-assignable. 

plnkr reference:http://plnkr.co/edit/UoQHYwAxwdvX0qx7JFVW?p=preview


Solution

  • As HackedByChinese mentioned, you can't bind ng-model to a function, so try like this:

    <input type="text" ng-if="displayNameData[0].show"
                       ng-model="displayNameData[0].value">
    

    Or if you want this control to be visible you can create directive, add function to $parsers that will set empty value according to show:

        angular.module('yourModule').directive('bindIf', function() {
            return {
                restrict: 'A',
                require: 'ngModel',
    
                link: function(scope, element, attrs, ngModel) {
                    function parser(value) {
                        var show = scope.$eval(attrs.bindIf);
                        return show ? value: '';
                    }
    
                    ngModel.$parsers.push(parser);
                }
            };
        });
    

    HTML:

    <input type="text" bind-if="displayNameData[0].show"
                       ng-model="displayNameData[0].value">