AngularJS's module.constant
не визначає константу в стандартному сенсі.
Хоча він стоїть самостійно як механізм реєстрації провайдера, його найкраще розуміти в контексті пов'язаної module.value
( $provide.value
) функції. В офіційній документації чітко зазначено випадок використання:
Зареєструйте послугу значень за допомогою інжектора $, такого як рядок, число, масив, об'єкт або функція. Це коротке значення для реєстрації послуги, де властивість $ get свого постачальника - це фабрична функція, яка не бере аргументів і повертає послугу цінностей. Це також означає, що неможливо вводити інші послуги в ціннісну послугу.
Порівняйте це з документацією для module.constant
( $provide.constant
), де також чітко зазначено випадок використання (міна акценту):
Зареєструйте постійну службу за допомогою інжектора $, такого як рядок, число, масив, об'єкт або функція. Як і значення, не можна вводити інші послуги в константу. Але на відміну від значення, константа може бути введена у функцію конфігурації модуля (див. Angular.Module), і її не можна перекрити декоратором AngularJS .
Тому constant
функція AngularJS не забезпечує константу в загальновизнаному значенні цього терміна в полі.
Враховуючи це, обмеження, розміщені на наданому об'єкті, а також його попередня доступність через інжектор $, явно говорить про те, що назва використовується аналогічно.
Якби ви хотіли фактичної константи в програмі AngularJS, ви б "надали" так само, як і в будь-якій програмі JavaScript, яка є
export const π = 3.14159265;
У Angular 2 застосовується та сама техніка.
Кутові програми 2 не мають фази конфігурації в тому ж сенсі, що і програми AngularJS. Крім того, не існує механізму декорування послуг ( AngularJS Decorator ), але це не особливо дивно, враховуючи, наскільки вони відрізняються один від одного.
Приклад
angular
.module('mainApp.config', [])
.constant('API_ENDPOINT', 'http://127.0.0.1:6666/api/');
є невиразним довільним і злегка відкладеним, тому $provide.constant
що використовується для вказівки об'єкта, який, до речі, є також константою. Ви, можливо, так і написали
export const apiEndpoint = 'http://127.0.0.1:6666/api/';
бо все може змінитися.
Тепер аргумент за доказовості, глузуючи з постійної, зменшується, оскільки він буквально не змінюється.
Один не знущається з π.
Звичайно, ваша семантика програми може полягати в тому, що ваша кінцева точка може змінитися, або ваш API може мати непрозорий механізм відмови, тому доцільно, щоб кінцева точка API змінювалася за певних обставин.
Але в цьому випадку надання його як рядкового буквального представлення однієї URL-адреси constant
функції не спрацювало б.
Кращий аргумент, і, ймовірно, ще один узгоджений з причиною існування $provide.constant
функції AngularJS полягає в тому, що при введенні AngularJS JavaScript не мав стандартної концепції модуля. У такому випадку глобалісти використовуються для обміну значеннями, що змінюються або незмінні, а використання глобалів проблематично.
Однак, надання чогось подібного за допомогою рамки збільшує зв'язок із цією рамкою. Він також змішує кутову логіку та логіку, яка працюватиме в будь-якій іншій системі.
Це не означає, що це неправильний чи шкідливий підхід, але особисто, якщо я хочу константу в додатку Angular 2, я напишу
export const π = 3.14159265;
так само, як і коли б я використовував AngularJS.
Чим більше речей змінюється ...
AppSettings
клас повинен бути абстрактним, а йогоAPI_ENDPOINT
членом повинен бутиreadonly
.