Подтвердить что ты не робот

Функция пропуска в ng-модели

Можно ли передать функцию в ng-модель, например

<input type="text" name="email" class="form-control" ng-model="createModel('email')" ng-change="addProperty(email,'email')" email required placeholder="Email">

ng-change работает нормально, но ng-model="createModel(email)" показывает эту ошибку

> Expression 'createModel('email')' is non-assignable. Element: <input
> type="text" name="email"....

В контроллере у меня есть: // Я просто хочу передать значение на данный момент

  $scope.createModel = function(modelName){
     console.log("Model name"+modelName);
  }

Я видел примеры в Интернете, что люди делают это

4b9b3361

Ответ 1

Похоже, что AngularJS добавила поддержку "getter" "setter" в версии 1.3

Вы можете прокручивать нижнюю часть страницы документации ngModel по адресу:

https://docs.angularjs.org/api/ng/directive/ngModel

Это позволяет вам указать метод вместо переменной в вашем атрибуте ngModel. Метод должен принимать необязательный параметр. Если аргумент передан, он должен сохранить это значение, если аргумент не передан, он должен вернуть значение.

Вы можете увидеть пример в другом ответе на переполнение стека: fooobar.com/questions/202285/...

Ответ 2

Невозможно передать функцию ng-model, потому что Angular должен иметь возможность установить значение, когда пользователь меняет входное значение. Вы не можете сказать Angular вместо вызова функции при изменении значения. Что вы можете сделать, так это определить свойство в области с помощью метода getter и setter, например:

var email = '[email protected]';
Object.defineProperty($scope, 'email', {
  get: function() {
    return email;
  },
  set: function(value) {
    email = value;
  }
});

Но я бы сказал, что вам лучше создать $watch для свойства, поскольку это будет более знакомо другим разработчикам Angular.

EDIT: Чтобы привязываться к другим моделям в зависимости от других значений, вы все равно привязываетесь к одному и тому же свойству в ng-model, но вы можете поменять его на часы. Что-то вроде этого:

var model1 = {
  value: 'hi'
};
var model2 = {
  value: 'hello'
};
$scope.model = model1;

$scope.checkboxValue = true;
$scope.$watch('checkboxValue', function(value) {
  if (value) {
    $scope.model = model1;
  } else {
    $scope.model = model2;
  }
});

и

<input type="text" ng-model="model.value">
<input type="checkbox" ng-model="checkboxValue">

Это изменит значение вашего ввода текста в зависимости от того, установлен флажок или нет.