我已经创建了一个服务来在控制器之间传递一个布尔标志。 服务看起来像这样:
angular.module('MyApp')
.service('sharedProperties', function () {
var flag = false;
return {
getProperty: function () {
return flag;
},
setProperty: function(value) {
flag = value;
}
};
});
设置标志的第一个控制器是这个
angular.module('MyApp')
.controller('test1', function($scope, $location, $http, $window, sharedProperties) {
$scope.flag1 = function () {
if ($location.path() == '/') {
sharedProperties.setProperty(false);
return false;
}else {
sharedProperties.setProperty(true);
return true;
};
};
});
控制器接收参数是这个
angular.module('MyApp')
.controller('test2', function($scope, $location, $http, $window, sharedProperties) {
$scope.flag2 = sharedProperties.getProperty();
});
test1中的flag1采用正确的值,但test2始终为false。如果我将service中的flag初始化为true - 它在test2中始终为true。如果我没有初始化它 - 它在test2中未定义。
答案 0 :(得分:3)
这种行为是完全可以预料到的,特别是没有与angularjs相关联,它在vanilla javascript中就像这样。您遇到的问题是由于javascript原语是按值传递而不是通过引用传递的。您可以在此处详细了解:Is JavaScript a pass-by-reference or pass-by-value language?
如何修复代码?使用将通过引用传递的对象。
你可以试试这个:
angular.module('MyApp')
.service('sharedProperties', function () {
var flag = {
value: false
};
return {
getProperty: function () {
return flag;
},
setProperty: function(value) {
flag.value = value;
}
};
});
angular.module('MyApp')
.controller('test1', function($scope, $location, $http, $window, sharedProperties) {
$scope.flag1 = function () {
if ($location.path() == '/') {
sharedProperties.setProperty(false);
return false;
}else {
sharedProperties.setProperty(true);
return true;
};
};
});
angular.module('MyApp')
.controller('test2', function($scope, $location, $http, $window, sharedProperties) {
$scope.flag2 = sharedProperties.getProperty();
// use flag2.value in your markup
});
答案 1 :(得分:1)
原因是我相信Angular在添加到控制器时会使用new
初始化服务。
因此,当在test1中进行操作时,它是该控制器中不在另一个控制器中共享的服务实例。我可能会错,并建议先使用this.flag
代替var flag
。另外,你的test2控制器调用角度加载,渲染false
,但它不会注意变化。
创建了一个JSBIN来为您解决:http://jsbin.com/xoqup/1/edit