Почему переменное имя "$ scope" необходимо?
Я новичок в Javascript (только что закончил книгу "Красноречивый Javascript" ), и сейчас я читаю AngularJS от O'Reilly. И получение этого небольшого фрагмента кода для работы из книги заставляло меня сумасшедшим часами и приводило меня к кроличьим отверстиям, думая, что я где-то испортил настройку своей среды.
Единственное различие в коде, предоставленном в книге AngularJS, и код, который я набрал, заключались в том, что я оставил "$" в "$ scope" в функции TextController. Ввод "$" обратно позволил коду работать.
Вот мои рассуждения о том, чтобы изначально его оставить:
О, "$ scope" - это просто имя переменной, локальное для функции. Как и любой другой язык программирования, такой как Java или С++, потому что этот параметр является только локальной переменной, я могу назвать его как угодно, поскольку любой аргумент, передаваемый в функцию, будет просто передаваться по значению.
Пожалуйста, исправьте мои рассуждения и объясните, почему имя параметра должно быть "$ scope" .
<!doctype html>
<html ng-app>
<body ng-controller="TextController">
<p>{{someText}}</p>
<script src="angular.min.js"></script>
<script>
function TextController($scope) {
$scope.someText = 'You have started your journey.';
}
</script>
</body>
</html>
Ответы
Ответ 1
Это обрабатывается инжектором Angular.
http://docs.angularjs.org/api/auto/service/ $инжектор
В JavaScript при вызове функции toString() функция возвращает определение функции. Затем определение может быть проанализировано, и аргументы функции могут быть извлечены. ПРИМЕЧАНИЕ. Это не работает с инструментами минимизации и обфускации, поскольку эти инструменты изменяют имена аргументов.
http://docs.angularjs.org/guide/di
При задании функции инжектор может вывести имена службы для инъекции, изучив объявление функции и извлекая имена параметров. В приведенном выше примере $scope и greeter - это две службы, которые необходимо ввести в функцию.
Ответ 2
Оба предыдущих ответа верны, просто вы должны знать, что вы можете "переопределить" поведение по умолчанию, если вы объявляете контроллер таким образом:
module.controller("ControllerName",["$scope",function( custom_name ){ ... }]);
Пример:
var app = angular.module("myApp",[]);
app.controller("TextController",["$scope",function(glue){
glue.name1 = "John";
glue.name2 = "Paul";
glue.name3 = "George";
glue.name4 = "Ringo";
}]);
а затем:
<div ng-controller="TextController">
Hello {{ name1 }}, {{ name2 }}, {{ name3 }}, {{ name4 }}!
</div>
Работа здесь: http://jsfiddle.net/d4M2P/
Ответ 3
Поскольку Angular использует имя параметра в своей системе впрыскивания, которая создает контроллер.