Tidak dapat mencapai $ rootScope

162

File berikut "berfungsi" (artinya tidak ada kesalahan):

<!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>

tapi ini

<!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>

memberikan kesalahan:

Kesalahan: Penyedia tidak dikenal: $ rootScope dari modx
Sumber File: http://code.angularjs.org/angular-1.0.0rc7.js
Baris: 2491

WTF?

Malvolio
sumber
114
+1 untuk WTF sebagai garis bawah.
Eliran Malka

Jawaban:

307

Anda tidak dapat meminta misalnya selama tahap konfigurasi - Anda hanya dapat meminta penyedia.

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
});

Lihat http://docs.angularjs.org/guide/module untuk info lebih lanjut.

Vojta
sumber
9
Terima kasih, itu masuk akal, tetapi bagaimana Anda tahu itu? Apakah ada di dokumen?
Malvolio
143
@Mavolio Tidak, dia adalah salah satu dari 3 pengembang inti.
ChrisOdney
8
Nah, FWIW, sekarang ada di dokumen, di bawah bagian "Modul Memuat & Ketergantungan".
Mark Rajcok
1
@ Voljta Tapi bagaimana jika saya harus mengirimkan parameter dari luar dan menggunakannya config? katakan path root dalam aplikasi asp.net? Saya hanya tidak ingin menggunakan variabel global dan ingin menggunakan ng-init='root:<%= myroot %>'dan menggunakan rootnilai module.config.
vittore
7
@ Vittore saya pikir, memasukkan konfigurasi "luar" ini ke jendela global tidak masalah. Atau memiliki satu modul yang mendefinisikan semua hal ini dan kemudian Anda memuatnya di aplikasi Anda - mis. angular.module('config', []).constant('appRoot', '/local/js/app');(kode ini akan dihasilkan oleh server Anda (Anda bahkan bisa membuatnya sebagai file JS, daripada memasukkan ke dalam file html). Kemudian, aplikasi Anda memuat modul ini dan karenanya memiliki akses ke appRoot.
Vojta
7

Saya menemukan "pola" berikut ini sangat berguna:

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

di mana, MainCtrl adalah pengontrol. Saya tidak nyaman bergantung pada nama parameter fungsi Pengendali melakukan tiruan satu-ke-satu dari contoh karena takut bahwa saya mungkin mengubah nama dan membereskan semuanya. Saya lebih suka menggunakan $ inject secara eksplisit untuk tujuan ini.

Ram Rajamony
sumber
Itu rapi; tetapi bagaimana Anda mengakses MainCtrlseperti itu?
f1lt3r
Saya tahu komentar Anda sudah tua tetapi perlu menanggapi pertanyaan demi masa depan. Modul / pengontrol dapat didefinisikan seperti ini sehingga Anda dapat mengaksesnya dengan cara ini:angular.module('myMod', []).controller('theController', controllerFunction); controllerFunction.$inject = []; function controllerFunction() { }
Mutmatt
1

Saya tidak menyarankan Anda untuk menggunakan sintaksis seperti yang Anda lakukan. AngularJs memungkinkan Anda untuk memiliki fungsi yang berbeda seperti yang Anda inginkan ( run, config, service, factory, dll ..), yang lebih professional.In fungsi ini Anda bahkan tidak harus menyuntikkan yang sendiri seperti

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

Anda bisa menggunakannya, seperti yang Anda tahu.

Hazarapet Tunanyan
sumber