Есть ли какой-нибудь возможный способ избежать повторяющегося кода?

#javascript #angularjs

#javascript #angularjs

Вопрос:

Как удалить повторяющийся код, предоставив метод в качестве параметра в javascript? Ниже приведен код.

 var toastrService = function (toastr) {
  var _toastrService = this;

  _toastrService.success =function(message,title) {
      toastr.success(message,title);
  }

  _toastrService.info =function(message,title) {
      toastr.info(message,title);
  }

  _toastrService.error =function(message,title) {
      toastr.error(message,title);
  }

  _toastrService.warning =function(message,title) {
      toastr.warning(message,title);
  }

  _toastrService.success =function(message,title) {
      toastr.success(message,title);
  }

}
  

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

1. Зачем вообще что-либо из этого …?

2. почему бы не добавить третий параметр для цели?

3. Ваш toastrService имеет очень низкое значение, просто используйте напрямую toastr нет?

4. @DanieleTorino Я согласен и я не согласен 🙂 Если что-то изменится, код все равно придется менять. Необходимо оценить риск этого изменения, чтобы определить, действительно ли это ценно. Например, вы также можете изменить прокси-сервер в какой-то момент, так почему бы не защитить его, проксируя прокси-сервер и т.д. Инкапсуляция (как и многие другие вещи) должна быть не догматичной, а прагматичной.

5. success это хорошо, но вам действительно нужно это дважды ..?

Ответ №1:

Просто выполните итерацию по массиву строк свойств:

 ['success', 'info', 'error', 'warning', 'success'].forEach((prop) => {
  _toastrService[prop] = function(message, title) {
    toastr[prop](message, title);
  };
});
  

Если вам не нужно удалять лишние аргументы функции, вы можете сократить их до:

 ['success', 'info', 'error', 'warning', 'success'].forEach((prop) => {
  _toastrService[prop] = toastr[prop].bind(toastr);
});
  

Если функции не нужны this of toastr , то вы можете не использовать .bind и просто назначить обычную функцию:

 _toastrService[prop] = toastr[prop]
  

Ответ №2:

Чтобы сделать глобальное свойство вводимым, просто объявите его как значение AngularJS:

 angular.module("app",[]).value("toastrService", toastr);
  

Затем внедрите его там, где это необходимо:

 app.controller("ctrl", function (toastrService) {
    toastrService.info("Title","Message");
});
  

Для получения дополнительной информации см.