#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 }
}
Преимущества использования с параметром :
- Это можно проверить.Тестируемый код в значительной степени всегда более удобочитаем и поддерживается в долгосрочной перспективе.
- Это не зависит от вызывающего объекта. Эта функция может быть повторно использована любым количеством различных контроллеров / служб / и т.д., Поскольку она не зависит от существования области видимости или от структуры этой области.
Порядок выполнения ng-model
и ng-click
неоднозначен. Вместо этого вы должны использовать ng-change
или $watch
в $scope, чтобы убедиться, что вы получаете правильные значения переменной модели.
Комментарии:
1. Ерунда. Порядок
ng-model
событий иng-click
events понятен.