2013-04-29 35 views
44

Tôi đang cố gắng sử dụng mẫu hạt giống góc với cài đặt mặc định. Trong controllers.js Tôi sử dụng

angular.module('myApp.controllers', []). 
    controller('MyCtrl1', [function($scope) { 
     $scope.test = 'scope found!'; 
    }]) 
    .controller('MyCtrl2', [function() { 

    }]); 

$scope luôn không xác định. Khi tôi lấy bộ điều khiển ra khỏi mô-đun và đăng ký nó trên toàn cầu, nó hoạt động tốt. Như ở đây:

function MyCtrl1($scope) { 
    $scope.test = "scope found!"; 
} 
MyCtrl1.$inject = ['$scope']; 

Ai đó có thể giải thích cho tôi lý do vì sao đây là?

Trả lời

65

Bạn không thể kết hợp những thứ như thế. Bạn cần phải quyết định một trong hai khả năng sau:

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

// possibility 1 - this is not safe for minification because changing the name 
// of $scope will break Angular's dependency injection 
app.controller('MyController1', function($scope) { 
    // ... 
}); 

// possibility 2 - safe for minification, uses 'sc' as an alias for $scope 
app.controller('MyController1', ['$scope', function(sc) { 
    // ... 
}]); 

Tôi sẽ không khuyên bạn sử dụng cú pháp khác khai báo Bộ điều khiển trực tiếp. Sớm hay muộn với sự phát triển của bạn ứng dụng nó sẽ trở nên khó khăn để duy trì và theo dõi. Nhưng nếu bạn phải, có 3 khả năng:

function myController1 = function($scope) { 
    // not safe for minification 
} 

function myController2 = ['$scope', function(sc) { 
    // safe for minification, you could even rename scope 
}] 

var myController3 = function(sc) { 
    // safe for minification, but might be hard 
    // to read if controller code gets longer 
} 
myController3.$inject = ['$scope']; 
+1

Cám ơn giải thích. Tôi vẫn muốn biết cách tham khảo phạm vi $ bằng cách sử dụng cú pháp mặc định mà google cung cấp trong mẫu của họ: angular.module ('myApp.controllers', []). Bộ điều khiển ('MyCtrl1', [function() { }]) .controller ('MyCtrl2', [function() { }]); –

+0

@AshrafFayad Cách duy nhất để tham chiếu đến '$ scope' là xác định bộ điều khiển theo một trong các cách được đề cập ở trên. – TheHippo

+0

Không hoàn toàn đúng, trên thực tế bạn đã bỏ qua những gì tôi nghĩ là cách ưa thích nhất để làm điều đó. – finishingmove

0

Tôi cũng đang tìm kiếm một rằng, có vẻ như bạn cần phải gõ '$scope' trước khi chức năng, như sau:

angular.module('myApp.controllers', []). 
    controller('MyCtrl1', ['$scope', function($scope) { 
     $scope.test = 'scope found!'; 
    }]) 
    .controller('MyCtrl2', ['$scope',function() { 

    }]); 

Nó kinda làm nghĩa nào đó, tôi nghĩ rằng nó nên được rõ ràng hơn mặc dù ..

+0

'' $ scope'' là cần thiết để được đặt ở vị trí chính xác của nó. – Zeeshan

17

Đây là cách thích hợp:

angular.module('myApp.controllers', []); 

angular.module('myApp.controllers').controller('MyCtrl1', ['$scope', function($scope) { 

}]); 
-1

Bạn chỉ cần xóa '[' và ']' khi Bạn đang sử dụng $ scope.

angular.module('myApp.controllers', []). 
 
controller('MyCtrl1', function($scope) { 
 
    $scope.test = 'scope found!'; 
 
    }) 
 
    .controller('MyCtrl2', [ 
 
    function() { 
 

 
    } 
 
    ]);

+0

Bạn không thể * đơn giản * xóa [] khi sử dụng phạm vi (hoặc bất kỳ phạm vi nào khác, cho vấn đề đó). Bạn có thể làm điều đó, nếu bạn không quan tâm đến việc rút gọn, cái gì đó hoàn toàn khác. –

Các vấn đề liên quan