Javascript 在一个控制器中更新服务变量,并在另一个控制器中使用更新后的值-Angular JS
我在我的Javascript 在一个控制器中更新服务变量,并在另一个控制器中使用更新后的值-Angular JS,javascript,angularjs,Javascript,Angularjs,我在我的controller.js中定义了一个名为NameService的服务。我想在两个不同的控制器中使用NameService中的变量 我的服务如下 App.service('NameService', function(){ this.Name = ""; this.getName = function(){ return this.Name; }; this.setName = function(name){ this.Name = name; } }
controller.js
中定义了一个名为NameService
的服务。我想在两个不同的控制器中使用NameService
中的变量
我的服务如下
App.service('NameService', function(){
this.Name = "";
this.getName = function(){
return this.Name;
};
this.setName = function(name){
this.Name = name;
}
});
App.controller('page1Controller', ['$scope', '$http','NameService', function($scope, $http,NameService)
{
console.log(NameService.Name);
}]);
我有一个名为netController
的控制器,其中我正在更新Nameservice
中存在的Name
变量的值。我想在我的page1Controller
中使用更新后的值
NetController
如下所示:
App.controller('netController', ['$scope','$http','$window','NameService', function($scope,$http,$window,NameService)
{
$scope.initNet = function()
{
$http.post('/initNet',$scope.network).success(function(response)
{
if(response.status == "true")
{
$scope.$watch('NameService.setName()', function(){
NameService.Name = $scope.network.name;
});
NameService.setName($scope.network.name);
$window.location.href = '/page1';
}
else
{
$scope.error = "Error!";
}
});
}
}]);
如果我做了console.log(NameService.netName)
在mynetController
中,它正在打印更新的值
page1Controller
如下所示
App.service('NameService', function(){
this.Name = "";
this.getName = function(){
return this.Name;
};
this.setName = function(name){
this.Name = name;
}
});
App.controller('page1Controller', ['$scope', '$http','NameService', function($scope, $http,NameService)
{
console.log(NameService.Name);
}]);
当是doconsole.log(NameService.name)时代码>在我的page1Controller
中,它给出的是空字符串
谁能帮我修一下这个吗 使用工厂而不是服务
gisApp.factory('NameService', function () {
var _name = "";
return {
getName: function () {
return _name;
},
setName: function (name) {
_name = name;
}
}
});
因为当您调用打印该变量时,它还没有定义$http返回承诺,需要一些时间间隔。您是否尝试在page1Controller内设置间隔?像
App.controller('page1Controller', ['$scope', '$http','NameService', '$timeout' function($scope, $http,NameService, $timeout)
{
$timeout(function(){
console.log(NameService.name)
},2000);
...
已编辑
那就试试这样的
gisApp.service('NameService', function(){
return {
Name: '',
getName: function(){
return this.Name;
},
setName: function(name){
this.Name = name;
}
});
由于您使用的语法不同,您必须使用“new”创建该服务的实例,才能将其用作类。我也尝试过这样做。它仍在打印空字符串。请将默认值添加到名称,然后重试。如果要获取名称,请检查设置部分Yea!如果我初始化为name,它将打印name!它在我的netController中得到更新,但在我的page1Controller中它只打印名称。然后检查setName()部分。还可以键入console.log(NameService.netName),它必须是console.log(NameService.getName());您可以使用函数NameService.getName()来获取名称。但是在一个地方您使用NameService.netName来获取它,而在另一个地方您使用NameService.name?为什么不在这两个地方都使用NameService.getName()?我已经对代码做了更改!还是相同的错误。@Minions page1Controller何时相对于netController被实例化?由于$http调用,这可能只是您尝试检索值的时间问题。另外,一定要使用工厂而不是服务,这样您就可以正确地封装name字段。否则,其他人可以轻松覆盖支持变量的值,甚至不需要使用Set()方法My answer works。看一看。它跨控制器更新名称
。将观察者放在控制器的开头,并添加一个要传递给函数的参数,因为您没有该参数。使用我的第一个使用观察者的示例<代码>$scope.$watch('NameService.setName()',函数(newName){NameService.Name=newName})我已经试过你的建议了!仍然返回一个空字符串!我没有看到。你使用“setName”函数。你没有“netName”字段。你没有“name”字段。你有“name”。没有小写字母,有大写字母。我已经更改了我的代码!仍然给出相同的错误。