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)
在my
netController
中,它正在打印更新的值

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);
    }]);
当是do
console.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})