передать переменную области в метод scope

#javascript #angularjs

#javascript #angularjs

Вопрос:

Я вижу это большую часть времени

Вид:

 <input ng-model="vm.model">
<button ng-click="vm.method(vm.model)"></button>
  

контроллер:

 function Controller() {
    var vm = this;
    this.method = function(parameter) {
       // do things with the model passed as parameter.
       // although it could get accessed directly by vm.model
}
}
  

но это тоже сработало бы :

 <input ng-model="vm.model">
<button ng-click="vm.method()"></button>
  

Является ли плохой практикой, когда методы в контроллере напрямую обращаются к переменным, которые находятся в той же области, не передавая их в качестве параметра?

Ответ №1:

Неплохо обращаться к переменным области видимости непосредственно из метода без параметра.

Вы можете передать их в качестве параметра, если сам метод является универсальным и используется несколькими кнопками.

Один классический пример — это когда у вас есть несколько комбинаций исходных и целевых списков для перемещения элемента туда и сюда, используя один и тот же метод с исходными и целевыми параметрами.

Комментарии:

1. Это также несколько упрощает тестирование

Ответ №2:

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

Это полезно, если в вашем контроллере вы обрабатываете несколько представлений.

Допустим, в вашем ModelController вы выполняете все операции CRUD. У вас есть представление create, edit view и list view.

Создать представление:

 <input ng-model="vm.model">
<button ng-click="sharedMethod(vm.model)"></button>
  

Редактировать вид:

 <input ng-model="vm.model">
<button ng-click="sharedMethod(vm.model)"></button>
  

Просмотр списка:

 <div ng-repeat="vm in vmList">
    <input ng-model="vm.model">
    <button ng-click="sharedMethod(vm.model)"></button>
<div>
  

Ответ №3:

Следуя этому принципу, вы всегда должны вызывать функции explicity с параметрами из шаблона.

Давайте рассмотрим небольшой пример.

 var vm = this;
this.method = function(parameter) {
  //It's clearer that the function expects parameter.
  if (parameter) { //do something } 
}
  

Преимущества использования с параметром :

  1. Это можно проверить.Тестируемый код в значительной степени всегда более удобочитаем и поддерживается в долгосрочной перспективе.
  2. Это не зависит от вызывающего объекта. Эта функция может быть повторно использована любым количеством различных контроллеров / служб / и т.д., Поскольку она не зависит от существования области видимости или от структуры этой области.

Порядок выполнения ng-model и ng-click неоднозначен. Вместо этого вы должны использовать ng-change или $watch в $scope, чтобы убедиться, что вы получаете правильные значения переменной модели.

Комментарии:

1. Ерунда. Порядок ng-model событий и ng-click events понятен.