Ошибка: [ngModel: nonassign] Выражение не назначается
Попытка отобразить значение столбца из gridcollection на основе другого значения в той же строке.
Пользователь может выбирать/изменять значения в модальном формате, который содержит сетку со значениями. Когда модальное закрытие, значения передаются обратно. В этот момент я хотел бы установить значение для "Также известен как":
HTML:
Also known as: <input type="text" `ng-model="displayValue(displayNameData[0].show,displayNameData[0].value)">`
Я создал функцию в области видимости для выбора значения только тогда, когда значение "показать" истинно:
$scope.displayValue = function (show, val) {
if (show) {
return val;
}
else {
return '';
}
}
Однако, когда я закрываю modal, я получаю сообщение об ошибке:
Error: [ngModel:nonassign] Expression 'displayValue(displayNameData[0].show,displayNameData[0].value)' is non-assignable.
Ссылка plnkr: http://plnkr.co/edit/UoQHYwAxwdvX0qx7JFVW?p=preview
Ответы
Ответ 1
Как упоминалось в HackedByChinese, вы не можете привязать ng-модель к функции, поэтому попробуйте вот так:
<input type="text" ng-if="displayNameData[0].show"
ng-model="displayNameData[0].value">
Или, если вы хотите, чтобы этот элемент управления был видимым, вы можете создать директиву, добавить функцию в $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);
}
};
});
HTML:
<input type="text" bind-if="displayNameData[0].show"
ng-model="displayNameData[0].value">
Ответ 2
Использование ng-value вместо ng-model работало для меня.
Ответ 3
Вы можете привязать ng-model
к функции
Связывание с геттером/сеттер
Иногда полезно привязывать ngModel к геттер/сеттер. Геттер/сеттер - это функция, которая возвращает представление модели при вызове с нулевыми аргументами и множеств внутреннее состояние модели при вызове с аргументом. Это иногда полезно использовать это для моделей, которые имеют внутренний представление, отличное от того, что модель предоставляет вид.
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>
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;
}
};
}]);