Переменная AngularJS $rootScope существует, но недоступна

Я установил переменную $rootScope в одном из своих модулей и теперь хочу получить доступ к этой же переменной $rootScope в другом модуле. На данный момент я вижу, что в обоих модулях переменная установлена ​​правильно, но когда я пытаюсь получить доступ к переменной в $rootScope, я получаю только неопределенность.

Как я могу получить доступ к этой переменной, не используя обходной путь фабрики/сервиса? Переменная действительно проста, и $rootScope должно хватить для того, что мне нужно. Ниже я привел общий пример кода, чтобы проиллюстрировать проблему:

файл1.js

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

app.controller('Ctrl1', ['$scope', '$rootScope', function($scope, $rootScope) {
    $scope.myFunc = function() {
        $rootScope.test = 1;
    }
}

файл2.js

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

app.controller('Ctrl2', ['$scope', '$rootScope', function($scope, $rootScope) {
    $scope.need_to_access_this = $rootScope.test; // undefined
    console.log($rootScope); // returns JS object w/ test property set to 1
}

person Shawn Taylor    schedule 22.05.2014    source источник
comment
Модули находятся в отдельных частях дома?   -  person James Kleeh    schedule 22.05.2014
comment
Поместите это в plunkr или что-то в этом роде. Невозможно помочь без примера реализации.   -  person James Kleeh    schedule 22.05.2014


Ответы (2)


Я просто застрял в той же проблеме, когда понял, что вы определили эти свойства для $ rootScope до загрузки контроллеров или служб. Итак, что я сделал, так это установил начальные значения при запуске приложения. В вашем случае это будет так:

app.run(function($rootScope){
    $rootScope.test="variable";
})

`

person Arindam Barman    schedule 26.01.2015

В Ctrl1 значение $rootScope.test устанавливается внутри $scope.myFunc.

Проблема в том, что вы не вызываете эту функцию, поэтому свойство test в $rootScope никогда не устанавливается.

Вам нужно вызвать $scope.myFunc(); в Ctrl1 или установить $rootScope.test = 1; непосредственно в контроллере:

app.controller('Ctrl1', ['$scope', '$rootScope', function($scope, $rootScope) {
    $scope.myFunc = function() {
        $rootScope.test = 1;
    };

    $scope.myFunc();
}

or

app.controller('Ctrl1', ['$scope', '$rootScope', function($scope, $rootScope) {
    $rootScope.test = 1;
}

РЕДАКТИРОВАТЬ:

Приведенные выше предложения остаются в силе, поэтому вам нужно вызвать myFunc().

Но проблема с вашим кодом в том, что Ctrl1 принадлежит MyApp1, а Ctrl2 принадлежит MyApp2.

Каждое приложение имеет единую корневую область (документация здесь)

Вам нужно будет создать Ctrl2 в качестве контроллера MyApp1:

angular.module('MyApp1')
    .controller('Ctrl2', ['$scope', '$rootScope', function($scope, $rootScope) {
        $scope.need_to_access_this = $rootScope.test; // undefined
        console.log($rootScope); // returns JS object w/ test property set to 1
    }]);
person Catalin MUNTEANU    schedule 22.05.2014