Услуги требуют методов? Сбой впрыска в контроллер

0

Стремясь сохранить мой $ rootScope чистым, мне нужен объект, который содержит данные, которые распределяются между контроллерами в моем приложении. Как определено, сервисы - это способ сделать это в приложении с угловым выражением.

С учетом сказанного, требует ли служба для определения метода для работы или может ли он просто вернуть объект со списком свойств, которыми могут управлять контроллеры?

Кроме того, если объект, возвращаемый службой, является просто данными, что является лучшим способом включить его в область. Ниже приведено определение моего сервиса:

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 не определено, когда это выполняется.

Любые разъяснения будут очень признательны!

Z

  • 2
    Если все, для чего вы используете службу - это хранение значений, я бы рекомендовал использовать значение вместо службы. .value('gameData', { ... }) .
Теги:

2 ответа

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);
 });
  • 0
    Если я использую этот метод, как мне взаимодействовать с выражениями?
  • 0
    Я отредактировал, чтобы показать, как ваш код может выглядеть в качестве примера. Обратите внимание, что если вам нужны выражения, которые зависят от введения других констант, значений или сервисов, вам придется сделать то, что вы изначально пытались, и создать сервис без методов.
2

Нет, методы не являются обязательными в обслуживании. Причина, по которой вы работаете, не работает, потому что вы перепутали зависимость в контроллере.

Изменить:

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

в

['$rootScope', '$scope','gameData', function
   ($rootScope, $scope, gameData)
  • 0
    Чтобы избежать подобных проблем с инъекциями в будущем, я бы посоветовал OP посмотреть на использование gulp с gulp-ng-annotate или аналогичным набором инструментов. Тогда исходный код может просто использовать простые функции со всеми аннотациями, добавляемыми автоматически.
  • 1
    Вы также можете использовать ng-strict-di : docs.angularjs.org/error/$injector/strictdi

Ещё вопросы

Сообщество Overcoder
Наверх
Меню