Почему я не могу использовать $rootScope вместо $scope?
HTML-файл это:
<!DOCTYPE html>
<html lang="en" ng-app="myApp">
<head>
<meta charset="utf-8">
<title>HTTP Request</title>
<script src="angularjs"></script>
<script src="appjs"></script>
</head>
<body>
<div ng-controller="myCtrl1">
First Name: <input type="text" ng-model="fname" required>
Last Name: <input type="text" ng-model="lname" required>
<button ng-click="search()">Send HTTP Request</button>
<p>Searching for : {{fname}} {{lname}}</p>
<p>Response Status: </p>
<p>{{status}}</p>
<p>Data: {{data}}</p><br>
<p>Total number of results : {{data.numResults}}</p>
</div>
</body>
</html>
Я написал контроллер как:
var myApp = angular.module('myApp', []);
myApp.controller('myCtrl1', ['$rootScope', '$http', function($rootScope, $http) {
$rootScope.fname = "";
$rootScope.lname="";
$rootScope.search = function() {
var search_url = "/search?fname=" + $rootScope.fname + "&lname=" + $rootScope.lname;
alert (search_url);
// alert("/search?fname=" + $scope.fname + "&lname=" + $scope.lname);
$http({method:'GET', url:search_url})
.success(function(data, status, headers, config) {
$rootScope.status = status;
$rootScope.data = data;
$rootScope.headers = headers;
$rootScope.config = config;
});
};
}]);
Но он показывает url в alertbox как: /search? Fname=&lname= Но когда я везде использую $scope вместо $rootScope, он работает нормально (окно предупреждений показывает URL правильно / search? Fname=john&lname=player). Нужна помощь, чтобы понять $ rootScope в деталях. Благодарю.
2 ответа
Ты можешь использовать $rootScope
вместо $scope
но ваша переменная будет "глобальной", и все контроллеры (если у вас их больше одного) увидят ее.
Но преимущество угловых будет немного потеряно. Потому что все модели (ае ng-model
) будет создан под конкретные $scope
но нет $rootScope
Для каждого контроллера определить приват $scope
,
поэтому, если вы используете два контроллера в обоих, вы можете определить имя переменной:
$scope.data = "AAA";
а в другом контроллере:
$scope.data = "BBB";
они разные, потому что ссылаются на разные экземпляры (так называемые контроллеры)
о вашей проблеме:
Вы создали эти строки:
First Name: <input type="text" ng-model="fname" required>
Last Name: <input type="text" ng-model="lname" required>
под контроллером myCtrl1
, поэтому он не будет обновлять ваш $rootScope
но $scope
это относится к myCtrl1
,
Я думаю, что вы можете использовать ng-change
уведомить $rootScope
об изменении.
добавить в HTML:
First Name: <input type="text" ng-model="fname" ng-change ="onfnameChange(fname)" required>
Last Name: <input type="text" ng-model="lname" ng-change ="onlnameChange(lname)" required>
к контроллеру:
...
$scope.onfnameChange = function(val){
$rootScope.fname = val;
};
$scope.onlnameChange = function(val){
$rootScope.lname = val;
};
...
увидеть скрипку
Добро пожаловать в мир наследования прототипов.
Вы myCtrl1
сфера наследуется от $rootScope
но любые изменения, внесенные в свойства, такие как строка, целые числа и логические значения в этой области, не влияют на свойства родительской области ($rootScope
).
В основном вы можете получить доступ к свойствам родительской области, но вы не можете изменить их ссылку (для типов объектов). Любые изменения приводят к созданию новых свойств в дочерней области.
Посмотрите мою скрипку о том, как справиться с этим http://jsfiddle.net/qcUm6/1
Прочитайте это, и все ваши сомнения будут удалены https://github.com/angular/angular.js/wiki/Understanding-Scopes