rootScope обновляет переменную области видимости

Я создал переменную rootScope, например

$rootScope.globalData = data;
$rootScope.globalData.chillerConditions.HeatSource.Value = "ST";    //Default Value
$scope.chillerConditions.HeatSource.Value = 1;                      //Default Value

где data — мое возвращаемое значение из API. Также создайте переменную области видимости, которая представляет собой объект, содержащий список элементов.

$scope.chillerAttributes = data.ObjCandidateListChillerAttributes;
$scope.chillerConditions = data.ObjCandidateListConditions;

В HTML у меня есть:

<select ng-model="chillerConditions.HeatSource.Value" style="width:53%;" ng-options="item.Id as item.Description for item in ValidRatingHeatSource" ng-change="heatSourceChanged()" id="ddRatingHeatSource" class="form-control search-select designComboboxHeight" data-container="body"></select>

Здесь ValidRatingHeatSource

$scope.ValidRatingHeatSource = \*list of items*\

При изменении Drop Down я написал функцию. В этом

if($scope.chillerConditions.HeatSource.Value == 2)
{
  $rootScope.globalData.chillerConditions.HeatSource.Value = "HW";
}
else
{
  $rootScope.globalData.chillerConditions.HeatSource.Value = "ST";
}

До сих пор был мой текущий код. Проблема:

Когда вышеупомянутая функция вызывается, то всякий раз, когда текущая переменная $rootScope, т. е. $rootScope.globalData.chillerConditions.HeatSource.Value, изменяется на "HW" или "ST", она также изменяет $scope.chillerConditions.HeatSource.Value на "HW" или "ST".

Почему так?

Есть ли встроенная функциональность в angularjs? Пожалуйста, предложите, если я делаю какую-либо ошибку? Новые предложения также приветствуются.


person Romesh    schedule 29.12.2014    source источник
comment
Возможно, ng-model (chillerConditions.HeatSource.Value) присоединен как к $scope.chillerConditions.HeatSource.Value, так и к $rootScope.chillerConditions.HeatSource.Value. Поэтому, когда выбор изменяется, меняется и переменная, прикрепленная к ng-model. Не уверен в этом, но, возможно, стоит попробовать переименовать переменную $scope.   -  person simeg    schedule 29.12.2014


Ответы (2)


Такое поведение соответствует тому, как работает JavaScript, и не имеет ничего общего с AngularJS. JavaScript — это объектно-ориентированный (основанный на прототипах) язык, в котором обращение к объектам осуществляется по ссылке, а не по значению. Например. назначьте car2 для car1, и оба они будут ссылаться на один и тот же объект (JSFiddle)

var car1 = {make: "Audi"}
var car2 = car1;
car2.make = "Toyota";

Итак, в вашем случае $rootScope.globalData.chillerConditions.HeatSource и $scope.chillerConditions.HeatSource - это один и тот же объект.

Скорее похоже, что вы хотите создать копию. Вы можете сделать это с помощью angular.Copy.

$scope.chillerAttributes = angular.copy(data.ObjCandidateListChillerAttributes);
$scope.chillerConditions = angular.copy(data.ObjCandidateListConditions);
person Rei Mavronicolas    schedule 29.12.2014
comment
Я понял пример JSfiddel. Прямо сейчас я не помечаю его как «Принято», но как только я решу проблему, я отмечу его как «Принято». Спасибо - person Romesh; 29.12.2014

В вашем примере у вас есть как ng-model, так и ng-change, поэтому: 1. Значение изменения пользователя в select. 2. Изменения $scope.chillerConditions.HeatSource.Value (модель ng) 3. Запуск HeatSourceChanged (изменение ng) -> изменения $rootScope.globalData.chillerConditions.HeatSource.Value

Так что все работает как надо...

person Petr Averyanov    schedule 29.12.2014
comment
Ваш ответ является объяснением приведенного выше ответа. +1 - person Romesh; 29.12.2014