Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用服务在控制器之间共享状态_Javascript_Angularjs - Fatal编程技术网

Javascript 使用服务在控制器之间共享状态

Javascript 使用服务在控制器之间共享状态,javascript,angularjs,Javascript,Angularjs,我想通过使用服务在Angular应用程序中的多个控制器之间共享“状态”。我的代码如下。我遇到的问题是,通过vm.toggleStatus()启动状态更改的控制器已更新,但在我刷新页面之前,该状态不会在我的其他控制器中更新 controller1.js: angular.module('gameApp') .controller('PlayerActionsController', PlayerActionsController); PlayerActionsController.$inje

我想通过使用服务在Angular应用程序中的多个控制器之间共享“状态”。我的代码如下。我遇到的问题是,通过
vm.toggleStatus()
启动状态更改的控制器已更新,但在我刷新页面之前,该状态不会在我的其他控制器中更新

controller1.js:

angular.module('gameApp')
  .controller('PlayerActionsController', PlayerActionsController);

PlayerActionsController.$inject = ['$routeParams', 'playersService'];

function PlayerActionsController($routeParams, playersService) {
  var vm = this;
  var playerId = $routeParams.playerId;

  var getplayerInfo = function() {
    playersService.getPlayerInfo({
      playerId: playerId
    }).$promise.then(function(player) {
      vm.player = player;
    });
  };

  var init = function() {
    getplayerInfo();
  };

  init();

  vm.toggleStatus = function() {
    playersService.toggleStatus({
      playerId: playerId
    }, {}).$promise.then(function() {
      getplayerInfo();
    });
  };
}
controller2.js:

angular.module('gameApp')
  .controller('HeaderController', HeaderController);

HeaderController.$inject = ['$routeParams', 'playersService'];

function HeaderController($routeParams, playersService) {
  var vm = this;
  vm.playerId = $routeParams.playerId;

  var getPlayerInfo = function() {
    playersService.getPlayerInfo({
      playerId: vm.playerId
    }).$promise.then(function(player) {
      vm.player = player;
    });
  };

  var init = function() {
    getPlayerInfo();
  };

  init();
}
players.service.js:

angular.module('gameApp')
  .factory('playersService', ['$resource',
    function($resource) {
      var base = '/api/players/:playerId/';
      return $resource(base, {}, {
        getPlayerInfo: {method: 'GET', url: base + 'playerInfo'},
        toggleStatus: {method: 'PUT', url: base + 'toggleStatus'}
      });
    }]);

服务不会将数据推送到控制器,控制器需要从服务中提取数据或侦听数据更改

您可能想做的是更新您的服务,以便在数据更改时发出事件,然后让您的控制器列出这些事件,并在发生更改时进行更新。例如:

//service toggleStatus
toggleStatus = function(data) {
    ... what it currently does.


    $rootScope.$emit('StatusChangedEvent', newStatus);

    ... return promise;
}

// in your controllers

$rootScope.$on('StatusChangedEvent', function(evt, newStatus) {
    $scope.status = newStatus;
});

分享您的playerServiceimplemntation@Kram,补充说,谢谢!谢谢,我的印象是可以在控制器之间共享状态,而不会干扰
$rootScope
。控制器之间的双向通信通常使用服务完成。但是,为了将更改推送到控制器,而不让控制器拉它,通常使用$rootScope。可以通过嵌套视图在控制器之间进行单向通信,其中嵌套控制器继承父控制器。