2013-05-14 19 views
12

Nói chung, tôi muốn làm như sau và sẽ có một ng-app trong HTML của tôi:thủ bootstrapping AngularJS và sau đó nhận được các mô-đun

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

myApp.controller("AttributeCtrl", function ($scope) { 
    $scope.master = { 
     name: "some name" 
    }; 
}); 

Tuy nhiên, tôi cần phải tự bootstrap góc vì tôi chỉ sử dụng nó trong một phần của ứng dụng của tôi được tải thông qua $.load() của jQuery. Nếu tôi làm như sau:

main.js - đây là nơi trang Tôi muốn sử dụng góc trên đang được kéo vào

$("#form").load(contextPath + url, params, function() { 
    angular.bootstrap($("#angularApp")); 
}); 

Và sau đó trang bị kéo vào đã sở hữu nó javascript:

function AttributeCtrl($scope) { 
    $scope.master = { name: "some name"}; 
} 

Công trình này, tuy nhiên, lý tưởng nhất, tôi muốn các bộ điều khiển của mình được đặt ở mức mô-đun. Vì vậy, tôi sửa đổi mã trên như vậy

main.js

$("#form").load(contextPath + url, params, function() { 
    angular.bootstrap($("#angularApp", ["myApp"])); 
}); 

và sau đó ...

var app = angular.module("myApp"); // retrieve a module 

app.controller("AttributeCtrl", function($scope) { 
    $scope.master = { name: "some name"}; 
}); 

Lấy module theo cách này dường như không làm việc, mặc dù. Tôi có làm điều gì sai?

+0

Bạn có nhận được thông báo không tìm thấy mô-đun không? Nhà khai thác mô-đun và bộ điều khiển có được chạy trước khi gọi hàm bootstrap không? – BoxerBucks

+1

@gregg Chỉ cần cập nhật cho bạn. Họ cập nhật các tài liệu để làm cho nó rõ ràng. Họ nói rằng bạn chỉ có thể vượt qua trong các mô-đun được xác định trước. Hy vọng nó giúp. https://github.com/angular/angular.js/issues/3692 – zsong

+0

Làm thế nào bạn có thể đảm bảo thời gian cần để thực hiện tải cho đến khi bạn thử và tham khảo mô-đun mà mô-đun đã được khởi động vào thời điểm đó? –

Trả lời

1

Tôi không biết nếu điều này chỉ là trong các mã ví dụ bạn có ở đây nhưng:

angular.bootstrap($("#angularApp", ["myApp"])); 

nên

angular.bootstrap($("#angularApp"), ["myApp"]); 

Mã của bạn để lấy các mô-đun nên làm việc.

0

Cập nhật

Họ cập nhật các tài liệu hướng dẫn và bây giờ nó đọc như thế này

Mỗi mục trong mảng nên là tên của một module được xác định trước hoặc một (DI chú thích) chức năng rằng sẽ được gọi bởi bộ phun như là khối chạy . Xem: {@link angular.module module}


Có vẻ như một lỗi.

Cách bạn triển khai để truy xuất mô-đun là chính xác. Chỉ cần trích dẫn nó từ doc để làm cho nó rõ ràng vì nó có thể không được nổi tiếng.

Khi vượt qua hai hoặc nhiều đối số, mô-đun mới sẽ được tạo. Nếu đã vượt qua chỉ một đối số, một mô-đun hiện có (tên được chuyển là đối số đầu tiên cho mô-đun) được truy lục.

Đối với sự cố bạn đã đề cập, câu chuyện dài ...

Chức năng bootstrap gọi createInjector với danh sách module ['ng', ['ngLocale', function(){...}] , 'myApp'] (người cuối cùng là mô-đun bạn thông qua năm)

function bootstrap(element, modules) { 
    ... 
    var injector = createInjector(modules); 

Bên createInjector(), nó gọi loadModules cho mỗi mô-đun thông qua vào

function createInjector(modulesToLoad) { 
    forEach(loadModules(modulesToLoad), function(fn) { instanceInjector.invoke(fn || noop); }); 

loadModules gọi angularModule, được khởi tạo là angularModule = setupModuleLoader(window);, tạo đối tượng window.angular.module

function loadModules(modulesToLoad){ 
    .... 
    var moduleFn = angularModule(module); // triggers the error 

Lỗi xảy ra, vì angularModule có tham số thứ 2 là requires. Nếu không có nó, nó sẽ ném một ngoại lệ trên dòng này (dòng 1148) throw Error('No module: ' + name);

Báo cáo: https://github.com/angular/angular.js/issues/3692

+0

Đây không phải là lỗi. Bạn sai rồi. Đây là một plnkr làm việc http://plnkr.co/edit/UowJpWYc1UDryLLlC3Be?p=preview – vin

+0

@vin Hãy cắt nó đi. Tôi không muốn tranh luận với bạn vì bạn thực sự không hiểu chúng ta đang nói gì ở đây. – zsong

+0

Đủ công bằng, có thể tôi không hiểu vấn đề – vin

0

Không chắc nếu điều này được tính như là một lỗi hoặc một quyết định thực hiện (mặc dù một vẻ nghèo). Việc thêm một mảng trống sẽ giải quyết vấn đề chưa được xác định require mà bạn đang gặp phải và nên giải quyết vấn đề của bạn tổng thể.

var app = angular.module("myApp", []); // create a module 

app.controller("AttributeCtrl", function($scope) { 
    $scope.master = { name: "some name"}; 
});` 

Ngoài ra, trong fiddle bạn gọi {{name}} sẽ không hiển thị. Bạn nên gọi {{master.name}}


Sửa

Cảm ơn tất cả các bạn cho downvotes .. Dưới đây là một ví dụ làm việc. Chúc may mắn!

http://plnkr.co/edit/UowJpWYc1UDryLLlC3Be?p=preview

+0

KHÔNG. "Khi đã vượt qua hai hoặc nhiều đối số, một mô-đun mới sẽ được tạo. Nếu chỉ truyền một đối số, một mô-đun hiện có (tên được chuyển làm đối số đầu tiên cho mô-đun) sẽ được truy lục." – zsong

+0

Vì vậy, sau đó giải pháp là để tạo ra một mô-đun mới và sau đó gọi mô-đun đó bằng cách sử dụng bootstrap .. 'var app = angular.module ('myApp', []);' – vin

3

Bạn không thể tạo bộ điều khiển sau khi đã khởi động ứng dụng. Xem the documentation for angular.bootstrap.

Bạn nên gọi angular.bootstrap() sau khi bạn đã tải hoặc xác định mô-đun của mình. Bạn không thể thêm bộ điều khiển, dịch vụ, chỉ thị, vv sau khi khởi động ứng dụng.

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