ไม่สามารถไปที่ $ rootScope


162

ไฟล์ต่อไปนี้ "ทำงาน" (ความรู้สึกว่ามันไม่ได้เกิดข้อผิดพลาดใด ๆ ):

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

แต่นี่

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

ให้ข้อผิดพลาด:

ข้อผิดพลาด: ผู้ให้บริการที่ไม่รู้จัก: $ rootScope จาก
ไฟล์ต้นฉบับmodx : http://code.angularjs.org/angular-1.0.0rc7.js
บรรทัด: 2491

WTF?


114
+1 สำหรับ WTF เป็นบรรทัดล่าง
Eliran Malka

คำตอบ:


307

คุณไม่สามารถขออินสแตนซ์ในช่วงการกำหนดค่า - คุณสามารถขอเฉพาะผู้ให้บริการได้

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

ดูhttp://docs.angularjs.org/guide/moduleสำหรับข้อมูลเพิ่มเติม


9
ขอบคุณมันสมเหตุสมผลดี แต่คุณรู้ได้อย่างไร อยู่ในเอกสารหรือไม่
Malvolio

143
@Mavolio ไม่เขาเป็นหนึ่งในสามนักพัฒนาหลัก
ChrisOdney

8
ดี FWIW อยู่ในเอกสารตอนนี้ภายใต้ส่วน "การโหลดโมดูลและการอ้างอิง"
Mark Rajcok

1
@vojta แต่ถ้าฉันต้องการส่งผ่านพารามิเตอร์จากภายนอกและใช้มันในconfig? บอกว่ารูทพา ธ ในแอพ asp.net? ผมก็ไม่ต้องการที่จะใช้ตัวแปรทั่วโลกและต้องการที่จะใช้ng-init='root:<%= myroot %>'และการใช้ค่าลงroot module.config
vittore

7
@ vittore ฉันคิดว่าการกำหนดค่า "นอก" นี้ลงในหน้าต่างทั่วโลกนั้นใช้ได้ หรือมีโมดูลเดียวที่กำหนดสิ่งนี้ทั้งหมดแล้วคุณโหลดมันลงในแอพของคุณเช่น angular.module('config', []).constant('appRoot', '/local/js/app');(เซิร์ฟเวอร์ของคุณจะสร้างรหัสนี้ (คุณสามารถสร้างมันเป็นไฟล์ JS แทนที่จะฝังลงในไฟล์ html) จากนั้นแอปของคุณจะโหลดโมดูลนี้และเข้าถึงappRootได้
Vojta

7

ฉันพบว่า "รูปแบบ" ต่อไปนี้มีประโยชน์มาก:

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

โดยที่ MainCtrl เป็นคอนโทรลเลอร์ ฉันรู้สึกไม่สบายใจที่ต้องพึ่งพาชื่อพารามิเตอร์ของฟังก์ชั่นคอนโทรลเลอร์ที่ทำตัวเป็นแบบหนึ่งต่อหนึ่งสำหรับกรณีที่กลัวว่าฉันอาจเปลี่ยนชื่อและทำให้สิ่งต่าง ๆ สกปรกขึ้น ฉันชอบใช้ $ inject เพื่อวัตถุประสงค์นี้อย่างชัดเจน


นั่นเป็นระเบียบ แต่คุณเข้าถึงMainCtrlเช่นนั้นได้อย่างไร
f1lt3r

ฉันรู้ว่าความคิดเห็นของคุณเก่า แต่ก็คุ้มค่าที่จะตอบคำถามเพื่อประโยชน์ในอนาคต โมดูล / ตัวควบคุมสามารถกำหนดเช่นนี้เพื่อให้คุณสามารถเข้าถึงได้ในวิธีนี้:angular.module('myMod', []).controller('theController', controllerFunction); controllerFunction.$inject = []; function controllerFunction() { }
Mutmatt

1

ฉันไม่แนะนำให้คุณใช้ไวยากรณ์เหมือนที่คุณทำ AngularJs ช่วยให้คุณสามารถที่จะมีฟังก์ชันการทำงานที่แตกต่างกันตามที่คุณต้องการ ( run, config, service, factoryฯลฯ .. ) ซึ่งมีฟังก์ชั่น professional.In นี้คุณไม่ได้มีการฉีดด้วยตัวเองเช่น

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

คุณสามารถใช้มันอย่างที่คุณรู้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.