在Angular JS中的控制器之间共享数据?

时间:2015-06-29 05:49:02

标签: javascript angularjs variables service controller

在此之前标记为重复之前,我已经阅读了很多类似的问题,但我发现的所有答案似乎都使​​用了$ scope,在阅读完文档之后我并不确定我理解$ scope,或者为什么我会在这种情况下使用它。

我发现this tutorial描述了如何做我想做的事情。

但是,它正在使用一组数据。我只需要一个固体变量。另外,我不知道他为什么要为他创造的工厂服务宣布一个额外的对象;为什么不直接使用工厂作为对象?

我以为我可以这样做,但我不确定它是否会起作用。

创建我的工厂/服务:

var demoModule = angular.module("demoModule", []);

demoModule.factory("demoService", function() {
     var demoSharedVariable = null;
     return demoSharedVariable;
});

访问每个控制器中的共享变量:

var demoControllerOne = demoModule.controller("demoContollerOne", function(demoSharedVariable) {
     this.oneFunction = function(oneInput){
          demoSharedVariable = oneInput;
     };
});

var demoControllerTwo = demoModule.controller("demoContollerTwo", function(demoSharedVariable) {
     this.twoFunction = function(twoInput){
          demoSharedVariable = twoInput;
     };
});

这个方法会产生我之后的共享变量吗?

2 个答案:

答案 0 :(得分:2)

您需要注入服务才能使用它,然后访问服务变量。

demoModule.controller("demoContollerOne", function($scope, demoService) {
  $scope.oneFunction = function(){
    demoService.demoSharedVariable = $scope.oneInput;
  };
});

demoModule.controller("demoContollerTwo", function($scope, demoService) {
  $scope.twoFunction = function(){
    demoService.demoSharedVariable = $scope.twoInput;
  };
});

如果您使用的是控制器,则很少(或者不应该)注入并使用$ scope。由于controllerAs是一个相对较新的功能,当时我们别无选择,只能使用$ scope,所以找到$ scope的例子并不奇怪。

编辑:如果你没有使用controllerAs(比如本例),你需要$ scope来向视图公开函数或变量。

在摆弄它时,我发现有几个地方不正确,我会编辑代码。我不知道如何在不使用像$ watch这样的高级概念的情况下展示效果,如果您不理解,请提供自己的小提琴。

Jsbin

答案 1 :(得分:0)

重要的是,如果你想使用棱角分量,你必须要了解范围的知识。

由于您的工厂或控制器都不正确,我为您写了一个简单的例子来帮助您理解服务:

detail implementation in this plnkr

服务:

angular.module('myApp').service('MyService', [function() {

      var yourSharedVariable; // Your shared variable

      //Provide the setter and getter methods
      this.setSharedVariable = function (newVal) {
        yourSharedVariable = newVal;
      };

      this.getSharedVariable = function () {
        return yourSharedVariable;
      };

    }
]);

控制器:

myApp.controller('Ctrl2', ['$scope', 'MyService', '$window', function($scope, MyService, $window) {//inject MyService into the controller
    $scope.setShared = function(val) {
      MyService.setSharedVariable(val);
    };

    $scope.getShared = function() {
      return MyService.getSharedVariable();
    };

    $scope.alertSharedVariable = function () {
      $window.alert(MyService.getSharedVariable());
    };

}]);