错误:[ngModel:nonassign]表达式不可分配

Pin*_*aas 20 angularjs ng-grid

尝试根据同一行中的另一个值从gridcollection显示columnvalue.用户可以选择/更改包含带有值的网格的模态中的值.当模态关闭时,值将被传回.那时我想为'也称为'设置一个值:

HTML:

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

我在范围上创建了一个函数,仅在'show'值为true时才选择值:

$scope.displayValue = function (show, val) {
    if (show) {
        return val;
    }
    else {
        return '';
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我关闭模态时,我收到一个错误:

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

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

Blo*_*und 40

使用ng值而不是ng-model为我工作.


kar*_*una 16

正如HackedByChinese所提到的,你不能将ng-model绑定到一个函数,所以试试这样:

<input type="text" ng-if="displayNameData[0].show"
                   ng-model="displayNameData[0].value">
Run Code Online (Sandbox Code Playgroud)

或者,如果您希望此控件可见,您可以创建指令,添加函数$parsers 将根据以下内容设置空值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);
            }
        };
    });
Run Code Online (Sandbox Code Playgroud)

HTML:

<input type="text" bind-if="displayNameData[0].show"
                   ng-model="displayNameData[0].value">
Run Code Online (Sandbox Code Playgroud)

  • 正确,但在你的答案中指出你不能将`ng-model`绑定到一个函数是有帮助的. (3认同)

Ikr*_*rom 8

你可以绑定ng-model到功能

绑定到getter/setter
有时将ngModel绑定到getter/setter函数会很有帮助.getter/setter是一个函数,它在使用零参数调用时返回模型的表示,并在使用参数调用时设置模型的内部状态.对于内部表示与模型公开给视图的内部表示不同的模型,有时使用它是有用的.

的index.html

<div ng-controller="ExampleController">
  <form name="userForm">
    <label>Name:
      <input type="text" name="userName"
             ng-model="user.name"
             ng-model-options="{ getterSetter: true }" />
    </label>
  </form>
  <pre>user.name = <span ng-bind="user.name()"></span></pre>
</div>
Run Code Online (Sandbox Code Playgroud)

app.js

angular.module('getterSetterExample', [])
.controller('ExampleController', ['$scope', function($scope) {
  var _name = 'Brian';
  $scope.user = {
    name: function(newName) {
     // Note that newName can be undefined for two reasons:
     // 1. Because it is called as a getter and thus called with no arguments
     // 2. Because the property should actually be set to undefined. This happens e.g. if the
     //    input is invalid
     return arguments.length ? (_name = newName) : _name;
    }
  };
}]);
Run Code Online (Sandbox Code Playgroud)