服务需要方法吗?注入控制器失败

时间:2016-03-22 13:47:24

标签: javascript angularjs

为了保持我的$ rootScope干净,我需要一个包含我的应用程序中的控制器之间共享的数据的对象。根据定义,服务是在Angular应用程序中执行此操作的方式。

话虽如此,服务是否需要定义一个方法才能工作,或者它是否只需返回一个具有可由控制器操作的属性列表的对象?

此外,如果服务返回的对象只是数据,那么将其合并到范围中的最佳方法是什么。以下是我的服务定义:

angular.module('dataService', [])
.service('gameData', function() {
    this.loggedIn =  "false";
    this.gameJoined = "false";
    this.tableFull =  "false";
    this.username =  "";
    this.tableInfo =  {};
    this.gameNum =  null;
    this.atTable =  "";
    this.numJoined =  0;
    this.userNames =  [];
    this.numPlayers =  _.range(2,7);
    this.numOfRuns =  _.range(1,11);
});

当我使用此方法将服务注入控制器时:

client.controller('loginController',  ['$scope','gameData', function
   ($rootScope, $scope, gameData) {
     $scope.gameData = gameData;
   console.log('gameData: ');
   console.log(gameData.loggedIn);
 }]);

gameData.loggedIn in在运行时未定义。

非常感谢任何澄清!

ž

2 个答案:

答案 0 :(得分:2)

不,服务中的方法不是强制性的。您的代码无法正常工作的原因是因为您搞乱了控制器中的依赖项。

变化:

['$scope','gameData', function
   ($rootScope, $scope, gameData)

['$rootScope', '$scope','gameData', function
   ($rootScope, $scope, gameData)

答案 1 :(得分:2)

服务不必定义方法,但如果您只是想要一个对象,那么请考虑使用value(name, value)constant(name, value)来定义一个只返回值的服务。

这两者之间的区别在于可以将常量注入模块配置函数(值不能),并且值可以被装饰器覆盖(常量不能),但是对于一个简单的对象来共享数据要么做好这份工作。

angular.module('dataService', [])
.value('gameData', {
    loggedIn: false,
    gameJoined: false,
    tableFull: false,
    username: "",
    tableInfo: {},
    gameNum: null,
    atTable: "",
    numJoined: 0,
    userNames: [],
    numPlayers: _.range(2,7),
    numOfRuns: _.range(1,11)
});

client.controller('loginController', function($rootScope, $scope, gameData) {
     $scope.gameData = gameData;
   console.log('gameData: ');
   console.log(gameData.loggedIn);
 });