Làm cách nào để tạo các tệp điều khiển AngularJS riêng biệt?


315

Tôi có tất cả các bộ điều khiển AngularJS của mình trong một tệp, controls.js. Tập tin này được cấu trúc như sau:

angular.module('myApp.controllers', [])
  .controller('Ctrl1', ['$scope', '$http', function($scope, $http) {    
  }])
  .controller('Ctrl2', ['$scope', '$http', function($scope, $http) }
  }])

Những gì tôi muốn làm là đặt Ctrl1 và Ctrl2 vào các tệp riêng biệt. Sau đó tôi sẽ bao gồm cả hai tệp trong index.html của mình, nhưng nó nên được cấu trúc như thế nào? Tôi đã thử làm một số thứ như thế này và nó đưa ra một lỗi trong bảng điều khiển trình duyệt web nói rằng nó không thể tìm thấy bộ điều khiển của tôi. Có gợi ý nào không?

Tôi đã tìm kiếm StackOverflow và tìm thấy câu hỏi tương tự này - tuy nhiên, cú pháp này đang sử dụng một khung công tác khác (CoffeeScript) trên đầu Angular, và vì vậy tôi không thể làm theo.


AngularJS: Làm cách nào để tạo bộ điều khiển trong nhiều tệp

Câu trả lời:


399

Tập tin một:

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

Tệp hai:

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

}]);

Tập tin ba:

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

}]);

Bao gồm theo thứ tự đó. Tôi đề nghị 3 tệp để khai báo mô-đun là của riêng mình.


Đối với cấu trúc thư mục có rất nhiều ý kiến ​​về chủ đề này, nhưng hai cái này khá tốt

https://github.com/angular/angular-seed

http://briantford.com/blog/huuuuuge-angular-apps.html


1
Nếu OP chỉ ra sự nhầm lẫn về cú pháp CoffeeScript, có lẽ tốt nhất là không sử dụng nó trong câu trả lời của bạn?
Andrew

3
@Andrew giúp đỡ trong tương lai và lập hồ sơ về các giải pháp là những gì SO thực sự hướng tới, không phải là q và a.
Fresheyeball

2
@RuslanIsmagilov của bạn appCtrllà một toàn cầu window.appCtrl. Đó không phải là một thực hành tốt.
Fresheyeball

1
@Fresheyeball, vấn đề của phương pháp này là thứ tự nhập trong index.html là quan trọng, nếu không, lỗi phát ra góc.
Deoxyseia

2
@hendryau, tôi đã làm việc với tên mô-đun có trong OP. Điều đó nói rằng, một số người cảm thấy rằng nó tốt hơn về mặt tổ chức, để có nhiều mô-đun khoảng cách tên, thay vì một mô-đun ứng dụng trung tâm.
Fresheyeball

177

Sử dụng API angular.module với một mảng ở cuối sẽ cho angular tạo ra một mô-đun mới:

myApp.js

// It is like saying "create a new module"
angular.module('myApp.controllers', []); // Notice the empty array at the end here

Sử dụng nó mà không có mảng thực sự là một hàm getter. Vì vậy, để tách biệt bộ điều khiển của bạn, bạn có thể làm:

Ctrl1.js

// It is just like saying "get this module and create a controller"
angular.module('myApp.controllers').controller('Ctrlr1', ['$scope', '$http', function($scope, $http) {}]);

Ctrl2.js

angular.module('myApp.controllers').controller('Ctrlr2', ['$scope', '$http', function($scope, $http) {}]);

Trong quá trình nhập javascript của bạn, chỉ cần đảm bảo myApp.js đứng sau AngularJS nhưng trước bất kỳ bộ điều khiển / dịch vụ / v.v ... nếu không thì angular sẽ không thể khởi tạo bộ điều khiển của bạn.


tôi nên viết phụ thuộc vào đâu var myapp = angular.module ('demo', ['ngRoute', 'ngCookies', 'ui.bootstrap', 'nvd3ChartDirectives', 'ui-RangeSlider', 'textAngular', 'angularTreeview'
vipin

@vipin giống như những gì bạn đã nhập, nhưng hãy đảm bảo rằng nó nằm trên bất kỳ bộ điều khiển, dịch vụ nào, v.v. Về mặt kỹ thuật, bạn không cần phải khai báo var myapp = ...; bởi vì góc sẽ lưu trữ nó cho bạn.
Jimmy Au

@JimmyAu Ctrl1.js và Ctrl2.js được tải ở đâu để trang có thể sử dụng nó? Tôi đã tải myApp.js ngay sau khi góc, nhưng trang không thể tìm thấy bộ điều khiển. Tôi có phải thêm chúng một cách rõ ràng như một kịch bản trên khung nhìn cần nó không? Hoặc tôi vẫn phải bao gồm mọi tệp điều khiển trên mỗi trang?
Sinaesthetic

2
Cảm ơn đã làm rõ lý do tại sao chỉ có cuộc gọi đầu tiên cần [].
Jim B.

49

Mặc dù cả hai câu trả lời đều đúng về mặt kỹ thuật, tôi muốn giới thiệu một lựa chọn cú pháp khác nhau cho câu trả lời này. Imho này giúp dễ dàng hơn để đọc những gì đang xảy ra với tiêm, phân biệt giữa vv

Tập tin một

// Create the module that deals with controllers
angular.module('myApp.controllers', []);

Tập tin hai

// Here we get the module we created in file one
angular.module('myApp.controllers')

// We are adding a function called Ctrl1
// to the module we got in the line above
.controller('Ctrl1', Ctrl1);

// Inject my dependencies
Ctrl1.$inject = ['$scope', '$http'];

// Now create our controller function with all necessary logic
function Ctrl1($scope, $http) {
  // Logic here
}

Tập tin ba

// Here we get the module we created in file one
angular.module('myApp.controllers')

// We are adding a function called Ctrl2
// to the module we got in the line above
.controller('Ctrl2', Ctrl2);

// Inject my dependencies
Ctrl2.$inject = ['$scope', '$http'];

// Now create our controller function with all necessary logic
function Ctrl2($scope, $http) {
  // Logic here
}

Thật thú vị, điều đó khiến tôi không truy cập vào nhiều tệp để đăng ký bộ điều khiển
mrwaim

4
Tôi thấy rất nhiều mã hóa như thế này. Lợi thế là gì? có $ chích và một chức năng riêng biệt.
Alaksandar Jesus Gene

2
Tôi tin rằng nó làm cho mã dễ đọc hơn. Tôi biết chính xác những gì đang được tiêm. Hãy nghĩ về nó như là một "sự tách biệt các mối quan tâm" trên cơ sở từng dòng một.
jason328

2
Mã như thế này không chỉ tạo ra mã dễ đọc hơn, dễ gỡ lỗi hơn và giảm số lượng mã gọi lại lồng nhau (xem github.com/johnpapa/angular-styleguide/blob/master/a1/
Thẻ

Nếu tôi có thể +1 này 1000 lần tôi sẽ - bravo!
Dan Chase

17

Giải pháp này thì sao? Các mô-đun và Bộ điều khiển trong Tệp (ở cuối trang) Nó hoạt động với nhiều bộ điều khiển, chỉ thị, v.v.

app.js

var app = angular.module("myApp", ['deps']);

myCtrl.js

app.controller("myCtrl", function($scope) { ..});

html

<script src="app.js"></script>
<script src="myCtrl.js"></script>
<div ng-app="myApp" ng-controller="myCtrl">

Google cũng có Đề xuất thực tiễn tốt nhất cho cấu trúc ứng dụng góc mà tôi thực sự muốn nhóm theo ngữ cảnh. Không phải tất cả các html trong một thư mục, nhưng ví dụ tất cả các tệp để đăng nhập (html, css, app.js, control.js, v.v.). Vì vậy, nếu tôi làm việc trên một mô-đun, tất cả các chỉ thị sẽ dễ dàng tìm thấy hơn.


3

Để cho ngắn gọn, đây là một mẫu ES2015 không dựa vào các biến toàn cục

// controllers/example-controller.js

export const ExampleControllerName = "ExampleController"
export const ExampleController = ($scope) => {
  // something... 
}

// controllers/another-controller.js

export const AnotherControllerName = "AnotherController"
export const AnotherController = ($scope) => {
  // functionality... 
}

// app.js

import angular from "angular";

import {
  ExampleControllerName,
  ExampleController
} = "./controllers/example-controller";

import {
  AnotherControllerName,
  AnotherController
} = "./controllers/another-controller";

angular.module("myApp", [/* deps */])
  .controller(ExampleControllerName, ExampleController)
  .controller(AnotherControllerName, AnotherController)

1
Bạn có thể tiết kiệm khá nhiều thao tác gõ nếu bạn đã sử dụng các hàm được đặt tên .. chúng có thuộc tính tiện dụng name.. vì vậy bạn chỉ cần sử dụng ExampleCtrl.namethay vì nhân đôi .. tăng gấp ba lần.
Antti Pihlaja

0

Không quá duyên dáng, nhưng rất nhiều đơn giản trong giải pháp thực hiện - sử dụng biến toàn cục.

Trong tệp "đầu tiên":


window.myApp = angular.module("myApp", [])
....

trong "thứ hai", "thứ ba", v.v .:


myApp.controller('MyController', function($scope) {
    .... 
    }); 

tôi sử dụng mã này nhưng vẫn không thể tải bộ điều khiển của tôi? nó ném lỗi: Lỗi: [ng: areq] Đối số 'ProductCtrl' không phải là một hàm, không xác định.
QViet

7
Đây thực sự là một thực tế tồi tệ
Brendan

@Kim Jong Un Bạn sẽ thấy lỗi đó nếu bạn không thêm / nối bộ điều khiển vào mô-đun mà bạn đã tạo. Vì vậy, nó sẽ hoạt động nếu bạn sử dụng cú pháp sau:angular.module('myApp').controller('ProductCtrl', ['$scope', '$http', function($scope, $http){ //Your ProductCtrl code goes here }]);
Devner

1
@Brendan, chỉ cần nói rằng một cái gì đó là thực hành xấu thì tốt hơn là không có gì - nhưng không nhiều. Hãy cho chúng tôi lý do tại sao nó là thực hành xấu sẽ giúp đỡ người khác.
Mawg nói rằng phục hồi Monica
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.