rootScope正在更新范围变量更新

时间:2014-12-29 12:07:38

标签: angularjs scope 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更改为{{1} }或"HW"

为什么会这样?

angularjs中是否有任何内置功能? 如果我有任何错误,请建议吗?我们也欢迎新的建议。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

在您的示例中,您同时具有ng-model和ng-change,因此: 1.用户更改选择值。 2. $ scope.chillerConditions.HeatSource.Value更改(ng-​​model) 3. heatSourceChanged启动(ng-change) - &gt; $ rootScope.globalData.chillerConditions.HeatSource.Value更改

所以一切正常......