$ RootScope alınamıyor


162

Aşağıdaki dosya "çalışır" (herhangi bir hata atmadığı duygusu):

<!doctype html>
<html ng-app="modx">
    <script src="http://code.angularjs.org/angular-1.0.0rc7.js"></script> 
    <script>
        angular.module("modx", [], function($routeProvider) {
        });
    </script>
</html>

ama bu

<!doctype html>
<html ng-app="modx">
    <script src="http://code.angularjs.org/angular-1.0.0rc7.js"></script>
    <script>
        angular.module("modx", [], function($routeProvider, $rootScope) {
        });
    </script>
</html>

hatayı verir:

Hata: Bilinmeyen sağlayıcı: $ rootScope from modx
Kaynak Dosya: http://code.angularjs.org/angular-1.0.0rc7.js
Satır: 2491

O NE LAN?


114
Alt satır olarak WTF için +1.
Eliran Malka

Yanıtlar:


307

Örneğin yapılandırma aşaması sırasında isteyemezsiniz - yalnızca sağlayıcılardan isteyebilirsiniz.

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

// configure stuff
app.config(function($routeProvider, $locationProvider) {
  // you can inject any provider here
});

// run blocks
app.run(function($rootScope) {
  // you can inject any instance here
});

Daha fazla bilgi için http://docs.angularjs.org/guide/module adresine bakın .


9
Teşekkürler, bu çok mantıklı, ama bunu nasıl bildin? Dokümanlarda mıydı?
Malvolio

143
@Mavolio Hayır, 3 çekirdek geliştiriciden biri.
ChrisOdney

8
FWIW, şimdi "Modül Yükleme ve Bağımlılıklar" bölümünün altında dokümanlarda.
Mark Rajcok

1
@vojta Fakat parametreyi dışarıdan geçirmem ve kullanmam gerekirse ne olur config? asp.net uygulaması içinde kök yolu söyleyebilir misin? Ben sadece küresel değişkenleri kullanmak istemiyorum ng-init='root:<%= myroot %>'ve rootiçine değer kullanmak ve kullanmak istedim module.config.
vittore

7
@vittore Bu "dış" yapılandırmayı genel pencereye koymak gayet iyi. Ya da tüm bunları tanımlayan bir modüle sahip olmak ve daha sonra uygulamanıza yüklersiniz - ör. angular.module('config', []).constant('appRoot', '/local/js/app');(bu kod sunucunuz tarafından oluşturulur (hatta bir html dosyasına inlining yerine bir JS dosyası olarak da oluşturabilirsiniz). Ardından, uygulamanız bu modülü yükler ve bu nedenle appRoot.
Vojta

7

Ben çok yararlı olmak için aşağıdaki "desen" buldum:

MainCtrl.$inject = ['$scope', '$rootScope', '$location', 'socket', ...];
function MainCtrl (scope, rootscope, location, thesocket, ...) {

burada MainCtrl bir kontrolördür. İsimleri değiştirebileceğimden ve işleri karıştırabildiğimden korkmak için bire bir taklit eden Controller işlevinin parametre adlarına güveniyorum. Çok açıkça bu amaç için $ inject kullanmayı tercih ediyorum.


Bu temiz; ama buna nasıl erişiyorsunuz MainCtrl?
f1lt3r

Yorumunuzun eski olduğunu biliyorum, ancak geleceğe yönelik sorulara cevap vermeye değer. Modüller / kontrolörler bu şekilde tanımlanabilir, böylece bunlara şu şekilde erişebilirsiniz:angular.module('myMod', []).controller('theController', controllerFunction); controllerFunction.$inject = []; function controllerFunction() { }
Mutmatt

1

Ben önermiyoruz senin yaptığın gibi sözdizimi kullanmak. Angularjs istediğiniz kadar farklı işlevleri olmasına izin verir ( run, config, service, factory, vb ..), hangi daha professional.In bu fonksiyon hatta enjekte etmek zorunda değilsiniz kendiniz gibi

MainCtrl.$inject = ['$scope', '$rootScope', '$location', 'socket', ...];

Bildiğiniz gibi kullanabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.