Ответ 1
-
Какими могут быть параметры контроллера?
Параметры контроллера зависимости, которые вводятся службой инжектора AngularJS. Они могут быть чем угодно. Но обычно они службы, которые будут использоваться внутри контроллера.
-
Где функции контроллера вызываются с их параметрами?
Контроллеры, а также директивы, фильтры, службы и так много других вещей в AngularJS - это функции. Но структура управляет множеством , когда и , как вызывается эти функции.
То, что вы называете связанным с материалом, имеет имя: зависимость, как упоминалось выше. То, что вы называете магия, - это механизм действий с привязкой в зависимости от AngularJS ..
Когда эти функции (контроллеры и другие) вызывают инжектором, он считывает имена параметров (например:
$scope
или$http
илиangularFire
) и ищет зарегистрированную службу с этим именем, которая затем предоставляется в качестве параметра при вызове функции.Это просто. У вас есть несколько способов проинструктировать о ваших "зависимостях" (параметры, управляемые инжектором) инжектору.
Когда вы просто объявляете свою функцию как
function myCtrl($scope) {}
, инжектор сможет найти службу$scope
из имени параметра. Но если вы minify код JavaScript, инжектор больше не сможет найти службу, потому что имя параметра будет изменено на меньшую строку, например "a" или "x". Чтобы избежать этой проблемы, можно указать имя службы, которое должно быть введено, с использованием знака массива. В этом случае вы должны объявить свою функцию следующим образом:myCtrl = ['$scope', function($scope) {}]
В мире AngularJS вы увидите много обозначений массива. Теперь вы начинаете понимать это. Вы даже можете вводить
$scope
иangularFire
и использовать их с другими именами в своей функции (изменение имени не рекомендуется) - этот пример приведен для учебных целей):['$scope', 'angularFire', function(skop, af) {}]
- таким образом, внутри функции вы можете использовать $scope как "skop" и angularFire как "af". порядок служб в массиве соответствует порядку параметров.
Другой пример:
var myController = ['$scope', '$resource', '$timeout',
function($scope, $resource, $timeout) {
// this controller uses $scope, $resource and $timeout
// the parameters are the dependencies to be injected
// by AngularJS dependency injection mechanism
}
];
-
Где определено угловое определение?
В firebase модуль.
Как вы уже знаете сейчас, инжектор будет вводить что угодно, если у него есть это "вещь" имя, зарегистрированное и доступное в его записях. Если существует "сервис" с этим именем, он может предоставить его.
Каким образом создается этот
name => stuff
список, который использует инжектор?Модуль - это ответ. модуль - это немного больше, чем список
name => stuff
. Он находится в модуле, где вы регистрируете службы, фабрики, фильтры, директивы и т.д.Внимательно изучите методы Module в официальной документации... почти все они получают в качестве параметров: имя и некоторые " stuff" (где "материал" почти всегда является функцией, определяя либо контроллер, либо factory, либо директиву). Все это "материал" станет инъекционным через указанное имя.
Услуги AngularJS, такие как "$ timeout", "$ http" и другие, доступны по умолчанию, поскольку модуль ng уже загружен инфраструктурой.
Для дополнительных сервисов вам необходимо загрузить/потребовать модуль. Это то, что вы делаете с ngRouter, firebase и т.д. Загружая модуль , его зарегистрированный материал доступен для инъекций в вашем модуле/приложении.
Посмотрите шаг за шагом:
// An empty module:
var module = angular.module('myModule', []);
// Now, adding an "injectable" constant:
module.constant('niceStuff', { blip: 'blop', blup: 307 });
// We could add a service:
module.service('entityManager', ['$http', function($http){ }]);
// and so on... if I wanted to use "$resource" instead of "$http"
// in the entityManager service above...
// ...I would need to require the ngResource when creating the module above,
// like this: var module = angular.module('myModule', ['ngResource']);
// because "$resource" is not available by default
// NOW, anywhere else, since the code above already ran
// I can use those NAMES as dependencies like this:
// We are creating another module now:
var koolModule = angular.module('km', ['myModule']);
// Note that I am requiring the previous module through its registered name
// Now, anything I've declared in that module
// - just like "ng" (by default) and "firebase" (required) does -
// is available for "injection"!!!
koolModule.controller('koolController',
['niceStuff', 'entityManager', function(niceStuff, entityManager) {
console.log(niceStuff.blip); // 'blop'
console.log(niceStuff.blup + 10); // 317
}]
);
Вот как становится доступным материал firebase, например angularFire! Что мы наделали? Сначала мы создали "myModule" и зарегистрировали материал NAMED. Позже мы потребовали "myModule" для нашего "koolModule" - и эти NAMES уже были доступны в списке инжекторов name => stuff
.
-
Как fbURL в связанном параметре
Как мы только что видели, большинство методов модуля просто регистрируют вещи - дают именак вещам, поэтому они могут быть введены и/или использоваться через эти имена позже.
Когда вызывается
module.value('fbURL', 'https://angularjs-projects.firebaseio.com/')
, fbURL (и указанное значение) регистрируется в спискеname => stuff
... в этом случае имя "fbURL", а значение /stuff - строка URL - но это может быть что угодно! -
Есть ли место, где я могу видеть все службы, например. $location и $timeout, что Angular.js предоставляет?
Да, ссылка API: http://docs.angularjs.org/api/
Обратите внимание на , как организована левая навигация... с помощью модулей! Во-первых, модуль ng с множеством директив, сервисов, фильтров и т.д. Далее, другие модули (ngRoute, ngResource, ngMock и т.д.), Каждый из которых содержит свои собственные службы, филеры или директивы...
Спасибо за возможность поделиться этими мыслями. Мне нравилось писать их.