2015-06-05 2 views
2

У меня есть скрипт angularjs с этим кодом:Глобальных переменного между запуском и контроллером angularjs

var myApp = angular.module('App_example', ['duScroll']) 
.run(function($rootScope, $location, $window) { 

    var url = $window.location.href; 
    if(url.indexOf("section1") != -1) { 
     $rootScope.edition = "section1"; 
    } else { 
     if(url.indexOf("section2") != -1) { 
      $rootScope.edition = "section2"; 
     } else if(url.indexOf("section3") != -1) { 
      $rootScope.edition = "section3"; 
     } else { 
      $rootScope.edition = "section4"; 
     } 
    } 
    if(!history || !history.replaceState) { 
     return; 
    } 
    $rootScope.$on('duScrollspy:becameActive', function($event, $element){ 
     //Automaticly update location 
     var hash = $element.prop('hash'); 
     if (hash) { 
      history.replaceState(null, null, hash+'_'+$rootScope.edition); 
     } 
    }); 
}); 

и этот контроллером:

myApp.controller('ImageController', ['$scope', '$window', '$location', '$document', '$rootScope', function($scope,$window,$location,$document,$state,$rootScope) { 

    var url = $window.location.href; 
    if(url.indexOf("section1") == -1) { 
     $rootScope.edition = "section1"; 
    } else { 
     if(url.indexOf("section2") != -1) { 
      $rootScope.edition = "section2"; 
     } else if(url.indexOf("section3") != -1) { 
      $rootScope.edition = "section3"; 
     } else { 
      $rootScope.edition = "section4"; 
     } 
    } 
}); 

Но у меня есть эта ошибка flollowing, и я не знаю, почему , Как передать глобальную переменную между прогоном и контроллером. Это для манипулирования URL без перезагрузки.

TypeError: Невозможно установить свойство 'издание' неопределенной

Спасибо.

+1

Вы пропустили '$ state' в определении зависимостей, поэтому' $ rootScope' присваивается параметру '$ state'. –

ответ

0

Добавить все зависимости, чтобы работать в правильном порядке, потому что вы пропустили некоторые (например $state)

myApp.controller('ImageController', 
    ['$rootScope', '$scope', '$window', '$location', '$document', '$state', 
    function ($rootScope, $scope, $window, $location, $document, $state) { 
     // code 
    }); 
+1

Спасибо, он отлично работает: D –

0

Проблема эта линия. В вашем массиве упоминаются 5 параметров, но ваша функция занимает 6. Вы забыли добавить $state в массив. Так как ваш код находится сейчас, он назначит $rootScope объекту $state, а $rootScope будет не определен.

myApp.controller('ImageController', ['$scope', '$window', '$location', '$document', '$rootScope', function($scope,$window,$location,$document,$state,$rootScope) { 

Просто добавьте $state в массив, и ваш код должен работать, как задумано.

myApp.controller('ImageController', ['$scope', '$window', '$location', '$document', '$state', '$rootScope', function($scope,$window,$location,$document,$state,$rootScope) {
+1

Могу ли я спросить, почему это было приостановлено? – FrankerZ

+0

Спасибо тоже: D Это не я, кто ниспроверг ^^ –

+0

Спасибо, но вы трое, чтобы ответить мне на одно и то же:/Я выберу первого, кто ответит, извините, но еще раз спасибо за то, –

2

Строковые элементы в массиве должны совпадать зависимости инъекционные (в качестве аргументов) на самой функции:

myApp.controller('ImageController', 
['$scope', '$window', '$location', '$document', '$state', '$rootScope', 
function ($scope, $window, $location, $document, $state, $rootScope) { 
    ... 
}]); 

И это потому, что вы используете «инъекции аннотированный зависимостей», то есть, вы явно обозначают зависимости со строками, прежде чем вводить их в контроллер. Это лучшая практика, чтобы избежать проблем с минификацией, как описано здесь: angular docs

Тем не менее, вы могли бы также решить проблему, передавая функцию непосредственно, без аннотирования зависимостей, например:

myApp.controller('ImageController', 
function ($scope, $window, $location, $document, $state, $rootScope) { 
    ... 
}); 
Смежные вопросы