Không thể truy cập $ rootScope


162

Tệp sau "hoạt động" (nghĩa là nó không ném bất kỳ lỗi nào):

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

nhưng điều này

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

đưa ra lỗi:

Lỗi: Nhà cung cấp không xác định: $ rootScope từ modx
Nguồn tệp: http://code.angularjs.org/angular-1.0.0rc7.js
Line: 2491

WTF?


114
+1 cho WTF là dòng dưới cùng.
Eliran Malka

Câu trả lời:


307

Bạn không thể yêu cầu ví dụ trong giai đoạn cấu hình - bạn chỉ có thể yêu cầu nhà cung cấp.

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

Xem http://docs.angularjs.org/guide/module để biết thêm thông tin.


9
Cảm ơn, nó có ý nghĩa hoàn hảo, nhưng làm thế nào bạn biết điều đó? Có phải trong tài liệu?
Malvolio

143
@Mavolio Không, anh ấy là một trong 3 nhà phát triển cốt lõi.
ChrisOdney

8
Chà, FWIW, giờ đây nó đã có trong tài liệu, trong phần "Tải mô-đun & phụ thuộc".
Mark Rajcok

1
@vojta Nhưng nếu tôi cần truyền tham số từ bên ngoài và sử dụng nó trong configthì sao? nói đường dẫn gốc trong ứng dụng asp.net? Tôi chỉ không muốn sử dụng các biến toàn cục và muốn sử dụng ng-init='root:<%= myroot %>'và sử dụng rootgiá trị vào module.config.
vittore

7
@vittore Tôi nghĩ rằng, đặt cấu hình "bên ngoài" này vào cửa sổ toàn cầu là ổn. Hoặc có một mô-đun xác định tất cả nội dung này và sau đó bạn tải nó trong ứng dụng của mình - ví dụ: angular.module('config', []).constant('appRoot', '/local/js/app');(mã này sẽ được tạo bởi máy chủ của bạn (thậm chí bạn có thể tạo nó dưới dạng tệp JS, sau đó nhập vào tệp html). Sau đó, ứng dụng của bạn tải mô-đun này và do đó có quyền truy cập appRoot.
Vojta

7

Tôi đã tìm thấy "mẫu" sau đây rất hữu ích:

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

trong đó, MainCtrl là một bộ điều khiển. Tôi không thoải mái khi dựa vào các tên tham số của chức năng Bộ điều khiển thực hiện mô phỏng từng trường hợp một vì sợ rằng tôi có thể thay đổi tên và làm hỏng mọi thứ. Tôi rất thích sử dụng $ chích cho mục đích này.


Đó là gọn gàng; Nhưng làm thế nào để bạn truy cập MainCtrlnhư vậy?
F1lt3r

Tôi biết nhận xét của bạn đã cũ nhưng đáng để trả lời các câu hỏi vì lợi ích của tương lai. Các mô-đun / bộ điều khiển có thể được định nghĩa như thế này để bạn có thể truy cập chúng theo cách này:angular.module('myMod', []).controller('theController', controllerFunction); controllerFunction.$inject = []; function controllerFunction() { }
Mutmatt

1

Tôi không đề nghị bạn sử dụng cú pháp như bạn đã làm. AngularJs cho phép bạn để có chức năng khác nhau như bạn muốn ( run, config, service, factory, vv ..), trong đó có nhiều professional.In chức năng này, bạn thậm chí không phải tiêm đó một mình như

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

bạn có thể sử dụng nó, như bạn biết

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.