AngularJS Общий сервис между контроллерами

0

У меня проблема с моей общей службой. Я создал службу, которая выглядит так:

.factory('ConfiguratorService', ['$q', 'ColourService', 'Moltin', 'ArrayService', function ($q, colourService, moltin, arrayService) {

    // Gets a new kit or gets from the session
    var getKit = function () {

        // Create the base model
        var model = {
            name: '',

            garments: [],
            totalPrice: 0,

            colour1: '',
            colour2: '',
            colour3: '',

            team: {
                name: '',
                sport: '',

                colour1: '',
                colour2: '',
                colour3: ''
            }
        };

        // If we have our model in the session, then return that otherwise use the base model
        return sessionStorage.designer ? angular.fromJson(sessionStorage.designer) : model;
    };

    // Declare our service
    var service = {

        // Define our properties
        selectedColours: [],
        selectedLeisureColours: [],
        kit: getKit(),

        // Init
        init: function (slug) {

            // Get our Sport
            return service.getSport(slug).then(function (response) {

                // If we get our sport, get our colours
                return colourService.list();

            // If we get our colours
            }).then(function (response) {

                // Add them to our service
                service.colours = response;
            });
        },

        // Gets our sport by it slug
        getSport: function (slug) {

            // Defer our promise
            var deferred = $q.defer();

            // If we have a slug 
            if (slug) {

                // Return the category
                moltin.categories.get(slug).then(function (response) {

                    // Assign our response to the service
                    service.sport = response;

                    // If we have a response
                    if (response) {

                        // Assign our sport to our team
                        service.kit.team.sport = response.slug;
                    }

                    // Resolve our promise
                    deferred.resolve(response);
                });

            // Otherise, nothing was supplied
            } else {

                // Resolve anyway
                deferred.resolve();
            }

            // Return our promise
            return deferred.promise;
        },

        // Saves the session to the session storage
        saveSession: function () {

            // Store our model in the session
            sessionStorage.designer = angular.toJson(service.kit);
        },

        // Clears the session
        clearSession: function () {

            // Remove our model from the session
            sessionStorage.removeItem('designer');
        }
    };

    // Return our service
    return service;
}])

У меня есть контроллер, который вызывает функцию init, и все работает нормально. Проблема, которую я имею, заключается в том, что в следующем представлении контроллер (хотя, когда я удаляю консоль, служба показывает все) не назначает цвета области.

Мой контроллер выглядит так:

.controller('DesignerTeamController', ['PageTitle', 'ConfiguratorService', 'ColourService', function (pageTitle, configuratorService, colourService) {
    var self = this;

    pageTitle.setTitle('Kudos Sports - Choose your team');

    console.log(configuratorService);

    // Assign our models
    self.colours = configuratorService.colours;
    self.range = [1, 2, 3];

    // Set our colours
    self.setColour = configuratorService.setColour;
}])

Console.log(configuratorService); на самом деле показывает configuratorService.colours как массив с 30 элементами в нем. Но, если я console.log(self.colours), я получаю undefined.

Кто-нибудь знает, почему?

  • 0
    console.log - это не снимок ... объект в консоли обновляется после того, как вы попытаетесь найти это свойство, пока оно еще не определено
  • 0
    Кажется довольно странным для меня Вы уверены, что не ошиблись? Если configuratorService.colours является массивом, то, безусловно, self.colours должен быть таким же.
Показать ещё 4 комментария
Теги:

1 ответ

4
Лучший ответ

Проблема возникает из-за отсутствия свойства цвета в объекте службы, пока getSport(slug) выполнят назначение.

Двумя способами вы могли бы это сделать:

1) назначить свойство как пустой массив, который обновляется в обратном вызове. Тогда свойство не будет определено в контроллере и потому что это массив, который будет создан ссылкой

var service = {
    colours:[]
    .....
}

Не разбивайте ссылку на массив в обратном вызове, просто обновляйте массив

// If we get our colours
}).then(function (response) {
     // Add them to our service
     service.colours.concat( response);
});

2) Другим подходом является назначение всего объекта службы переменной в контроллере:

// Assign our models
self.configModel = configuratorService;

Затем в представлении вы можете добавить свойство colours в свой объект configModel:

ng-if="vm.configModel.colours.length"

Ещё вопросы

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