Почему необходимо указывать угловые модули с заводскими функциями, а не аналогично тому, как я указываю Node-модули?
Я недавно начал использовать angularjs. Но это понятие модулей смущает меня.
В одном из угловых обучающих программ есть следующий код:
'use strict';
/* Services */
var phonecatServices = angular.module('phonecatServices', ['ngResource']);
//this line's added by me
phonecatServices.constant('SomeConstant', 123);
phonecatServices.factory('Phone', ['$resource',
function($resource){
return $resource('phones/:phoneId.json', {}, {
query: {method:'GET', params:{phoneId:'phones'}, isArray:true}
});
}]);
Почему angularjs требует вспомогательных функций, таких как константа или фабрика, когда он может точно так же определять модули способом, подобным таковому для nodejs, который намного чище? Я не понимаю, какие преимущества имеет этот подход.
var $resource = require('$resource');
var SomeConstant = 123;
var Phone = $resource('phones/:phoneId.json', {}, {
query: {method:'GET', params:{phoneId:'phones'}, isArray:true}
});
};
exports.SomeConstant = SomeConstant;
exports.Phone = Phone;
1 ответ
Кажется, ответ сосредоточен вокруг инъекции зависимостей от угловых.
Рассматривать angular.module
быть, как говорит API, глобальным средством для создания / регистрации или получения вашего модуля. Модуль должен быть создан таким образом, чтобы $injector
, которая является функцией, которая берет список имен модулей, которые были зарегистрированы, может найти его во время начальной загрузки.
Я бы не стал рассматривать factory
функция 'помощник', но вместо этого фактически способ указания угловому внедрению зависимостей js, как сервис должен быть создан. Или, как говорится в руководстве по внедрению зависимостей - мы "учим" $ инжектор, как создавать сервис:
// Provide the wiring information in a module
angular.module('myModule', []).
// Teach the injector how to build a 'greeter'
// Notice that greeter itself is dependent on '$window'
factory('greeter', function($window) {
// This is a factory function, and is responsible for
// creating the 'greet' service.
return {
greet: function(text) {
$window.alert(text);
}
};
});
// New injector is created from the module.
// (This is usually done automatically by angular bootstrap)
var injector = angular.injector(['myModule', 'ng']);
// Request any dependency from the injector
var greeter = injector.get('greeter');
Руководство также напоминает нам, что здесь инжектор создается непосредственно из модуля, но обычно загрузчик Angular позаботится об этом за нас.
Короче говоря, angular.module
говорит угловому, как разрешить модули (которые он делает через $injector
), а также factory
говорит угловой, как сделать или их, когда они нужны. Напротив, модули Node имеют взаимно-однозначное сопоставление с файлами и решаются и создаются таким образом.