angularjs .service不能在控制器之间传递变量

时间:2014-08-23 18:57:50

标签: javascript node.js angularjs express

我已经创建了一个服务来在控制器之间传递一个布尔标志。 服务看起来像这样:

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中未定义。

2 个答案:

答案 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