使用Angularjs将数据传递到不同的控制器

时间:2017-04-25 22:55:41

标签: javascript angularjs service factory

我在一个控制器中有以下代码。

    $scope.DataModel= [];
    $scope.DataModelTexts= { buttonDefaultText: '' };

我将在另一个控制器中使用相同的代码。现在,我不想在第二个控制器中编写相同的代码,我想知道是否有办法将它放在某个工厂或服务中的公共代码中,并在两个控制器中使用它。我试着阅读有关工厂和服务的内容,我对如何在我的场景中使用其中任何一个感到困惑。

任何信息都可以帮助我获得有关angularjs工厂和服务的更多知识。谢谢。

2 个答案:

答案 0 :(得分:1)

您正走在正确的轨道上,使用可以使用工厂或服务在控制器之间共享代码。请注意,角度服务(和工厂)是单身人士;它们在应用程序启动时被实例化,然后无论何时将其注入控制器,您都会引用相同的实例。请考虑以下代码:

var myApp = angular.module('myApp',[]);

myApp.service('MyService', function() {
  let _someValue = 'Initial Value';
  this.setValue = function(value){
    _someValue = value;
  }
  this.getValue = function(){
    return _someValue;
  }
});

//First Controller Run
myApp.controller('ControllerA', function($scope, MyService) {
  MyService.getValue(); //Initial Value
  MyService.setValue("BRAND NEW VALUE!!!");
});

//Run after ControllerA
myApp.controller('ControllerB', function($scope, MyService) {
  MyService.getValue(); //BRAND NEW VALUE!!!
});

她,你会看到MyService保持someValue的状态。 ControllerA将MyService注入其中,并可以使用该服务的方法来设置新值。现在,对于同一状态的任何后续调用,例如ControllerB,将返回更新的值。

答案 1 :(得分:0)

您可以使用.config()run()块(这里有好的SO:AngularJS app.run() documentation?)将这些重用的变量绑定到$ rootScope,然后从{{1}调用它们来自您的控制器或服务中的{和$rootScope.DataModel(只要您将$ rootScope注入这些控制器和服务中)。