Làm thế nào để xác định hai ứng dụng / mô-đun góc cạnh trong một trang?


118

Tôi đang cố gắng thêm hai ứng dụng / mô-đun góc cạnh vào một trang. Trong các câu đố dưới đây, bạn có thể thấy rằng luôn chỉ có mô-đun đầu tiên, được tham chiếu trong mã html, sẽ hoạt động chính xác, trong khi mô-đun thứ hai không được nhận dạng bằng góc.

Trong fiddle này, chúng ta chỉ có thể thực thi doSearch2phương thức, trong khi trong fiddle này, chỉ doSearchphương thức hoạt động chính xác.

Tôi đang tìm cách đặt chính xác hai mô-đun góc vào một trang.

Câu trả lời:


123

Chỉ một ứng dụng AngularJS có thể được tự động khởi động trên mỗi tài liệu HTML. NgApp đầu tiên được tìm thấy trong tài liệu sẽ được sử dụng để xác định phần tử gốc để auto-bootstrap như một ứng dụng. Để chạy nhiều ứng dụng trong một tài liệu HTML, thay vào đó bạn phải khởi động chúng theo cách thủ công bằng cách sử dụng angle.bootstrap. Các ứng dụng AngularJS không thể được lồng vào nhau. - http://docs.angularjs.org/api/ng.directive:ngApp

Xem thêm


@MarkRajcok Vì vậy, việc chỉ có một mô-đun cho mỗi tài liệu HTML có tốt không? Ví dụ "Wire up a Backend" trên trang AngularJS chính đặt ra ng-app="project"và nói rằng "điều này cho phép bạn có các mô-đun chạy ở các phần khác nhau của trang" nhưng tài liệu ngApp tuyên bố rằng "chỉ có thể sử dụng một chỉ thị cho mỗi tài liệu HTML".
theblang

9
@mattblang, các mô-đun được liên kết với các ứng dụng Angular và không thực sự là tài liệu HTML. Thông thường bạn chỉ cần một ứng dụng trên mỗi trang / tài liệu, nhưng nếu bạn muốn chạy nhiều ứng dụng Angular (mỗi ứng dụng có thể sử dụng một hoặc nhiều mô-đun) trên cùng một trang / tài liệu, thì bạn sẽ cần phải khởi động từng ứng dụng trong số chúng theo cách thủ công - - không sử dụng ng-app(vì nó sẽ không hoạt động). ng-appchỉ có thể được sử dụng một lần cho mỗi tài liệu HTML. Nó thực sự chỉ là một con đường tắt nếu bạn chỉ có một ứng dụng trên trang, đó là trường hợp bình thường.
Mark Rajcok

1
Có một ví dụ về điều này? Tôi thấy tài liệu api boostrap ngắn hạn nhưng tôi không thể làm cho nó hoạt động. Tôi đã googled điều này trong một thời gian và dường như không có một ví dụ làm việc nào. Ngoài ra, trên thế giới điều này sẽ hoạt động như thế nào với các tuyến đường? Rõ ràng là có vấn đề va chạm.
Robert Christian,

Ngoài ra, tôi thực sự thích cách sử dụng ng-app cho một nhà phát triển khác biết chính xác phần nào của trang đang được kiểm soát bởi mô-đun nào. Không có cách nào để sử dụng đánh dấu trên trang để thực hiện điều này? Hoặc ít nhất, một số gợi ý trong đánh dấu?
chrismarx

1
Hai đoạn văn đầu tiên cho thị ng ứng dụng nói lên tất cả - docs.angularjs.org/api/ng.directive:ngApp
Simo

38

Tôi đã tạo một chỉ thị thay thế không có ngAppgiới hạn. Nó được gọi là ngModule. Đây là những gì bạn mã sẽ trông như thế nào khi bạn sử dụng nó:

<!DOCTYPE html>
<html>
    <head>
        <script src="angular.js"></script>
        <script src="angular.ng-modules.js"></script>
        <script>
          var moduleA = angular.module("MyModuleA", []);
          moduleA.controller("MyControllerA", function($scope) {
              $scope.name = "Bob A";
          });

          var moduleB = angular.module("MyModuleB", []);
          moduleB.controller("MyControllerB", function($scope) {
              $scope.name = "Steve B";
          });
        </script>
    </head>
    <body>
        <div ng-modules="MyModuleA, MyModuleB">
            <h1>Module A, B</h1>
            <div ng-controller="MyControllerA">
                {{name}}
            </div>
            <div ng-controller="MyControllerB">
                {{name}}
            </div>
        </div>

        <div ng-module="MyModuleB">
            <h1>Just Module B</h1>
            <div ng-controller="MyControllerB">
                {{name}}
            </div>
        </div>
    </body>
</html>

Bạn có thể lấy mã nguồn tại:

http://www.simplygoodcode.com/2014/04/angularjs-getting-around-ngapp-limitations-with-ngmodule/

Về cơ bản, nó giống như mã được AngularJS sử dụng nội bộ mà không có giới hạn.


luisperezphd: Tôi đã đọc bài đăng trên blog của bạn. Có cách nào để lồng các ứng dụng (ví dụ: trình tạo tiện ích con với tiện ích con được tải AJAX) hoặc phát hiện xem một trang đã có ứng dụng chưa và đưa ứng dụng khác vào làm phụ thuộc của trang đầu tiên? Tôi vừa đăng câu hỏi của mình ở đây với nhiều chi tiết hơn về chính xác những gì tôi đang cố gắng hoàn thành. Cảm ơn!
Daniel Bonnell

@ACIDSTEALTH Thực tế là AngularJS đang báo cáo rằng phần tử đã được khởi động có nghĩa là phải có một số cách để biết - mặc dù mã đó có thể là nội bộ của AngularJS. Để tìm hiểu, bạn có thể tham khảo phiên bản AngularJS chưa hợp nhất và điểm ngắt trên lỗi đó để xem điều kiện if. Từ những gì tôi có thể tìm ra từ liên kết câu hỏi StackOverflow của bạn, có vẻ như bạn muốn tự động "tiêm" một mô-đun trong thời gian chạy. Nếu vậy, bạn có thể muốn xem bài viết này: weblogs.asp.net/dwahlin/…
Luis Perez

Này @LuisPerez, tôi đã kiểm tra trang web của bạn. Tôi mệt mỏi nó trên máy của tôi. angleJS không phát hiện "ng-modules" / "ng-module". Tôi có cần bất kỳ tài liệu tham khảo nào có trong tệp của mình không?
sujay kodamala

Có @sujaykodamala, ngModule không được tích hợp vào AngularJS mà đó là một chỉ thị tôi đã tạo. Bạn có thể tải xuống từ GitHub. Bạn có thể tìm thấy nó ở đây: github.com/luisperezphd/ngModule
Luis Perez

Xin chào @Luis Perez! Tôi đã kiểm tra bài đăng trên blog của bạn và chúng thực sự tuyệt vời. Nếu bạn có thời gian, bạn có thể vui lòng kiểm tra bài đăng của tôi ở đây để giải quyết vấn đề - stackoverflow.com/questions/46952478/… . Cảm ơn.
user8512043

19

Tại sao bạn muốn sử dụng nhiều [ng-app]? Vì Angular được tiếp tục bằng cách sử dụng các mô-đun, bạn có thể sử dụng một ứng dụng sử dụng nhiều phần phụ thuộc.

Javascript:

// setter syntax -> initializing other module for demonstration
angular.module('otherModule', []);

angular.module('app', ['otherModule'])
.controller('AppController', function () {
    // ...do something
});

// getter syntax
angular.module('otherModule')
.controller('OtherController', function () {
    // ...do something
});

HTML:

<div ng-app="app">
    <div ng-controller="AppController">...</div>
    <div ng-controller="OtherController">...</div>
</div>

BIÊN TẬP

Hãy nhớ rằng nếu bạn muốn sử dụng bộ điều khiển bên trong bộ điều khiển, bạn phải sử dụng cú pháp controllerAs, như sau:

<div ng-app="app">
    <div ng-controller="AppController as app">
        <div ng-controller="OtherController as other">...</div>
    </div>
</div>

Lỗi chưa gặp: [$ injector: modulerr] errors.angularjs.org/1.3.14/$injector/... ... criptMinification% 2Fbower_components% 2Fangular% 2Fangular.min.js% 3A17% 3A381)
Anandaraja_Srinivasan

Bạn đã thử đảo ngược thứ tự của 2 mô-đun chưa? ('OtherModule' trước 'app') Bởi vì, tôi sử dụng giải pháp này rất nhiều và nó hoạt động hoàn hảo ...
Monkey Monk

1
Đồng ý ! Tôi đã gặp lỗi trong phần giải thích Javascript mà tôi cung cấp. Tôi nghĩ rằng nó đã được sửa ngay bây giờ! Đối với bản ghi, tôi sẽ sử dụng cú pháp setter ở 2 nơi cho cùng một mô-đun ... điều này rõ ràng là không được phép! :-)
Monkey Monk

cách chúng tôi đặt ra để làm điều đó
Harry Bosh

9

Bạn có thể khởi động nhiều ứng dụng góc cạnh, nhưng:

1) Bạn cần khởi động chúng theo cách thủ công

2) Bạn không nên sử dụng "tài liệu" làm gốc, mà là nút chứa giao diện góc để:

var todoRootNode = jQuery('[ng-controller=TodoController]');
angular.bootstrap(todoRootNode, ['TodoApp']);

Điều này sẽ an toàn.


3

Khởi động thủ công cả hai mô-đun sẽ hoạt động. Nhìn này

  <!-- IN HTML -->
  <div id="dvFirst">
    <div ng-controller="FirstController">
      <p>1: {{ desc }}</p>
    </div>
  </div>

  <div id="dvSecond">
    <div ng-controller="SecondController ">
      <p>2: {{ desc }}</p>
    </div>
  </div>



// IN SCRIPT       
var dvFirst = document.getElementById('dvFirst');
var dvSecond = document.getElementById('dvSecond');

angular.element(document).ready(function() {
   angular.bootstrap(dvFirst, ['firstApp']);
   angular.bootstrap(dvSecond, ['secondApp']);
});

Đây là liên kết đến Plunker http://plnkr.co/edit/1SdZ4QpPfuHtdBjTKJIu?p=preview

LƯU Ý: Trong html, không có ng-app. idđã được sử dụng thay thế.


0

Tôi đã tạo POC cho ứng dụng Angular bằng cách sử dụng nhiều mô-đun và bộ định tuyến để lồng các ứng dụng con trong một ứng dụng trang. Bạn có thể lấy mã nguồn tại: https://github.com/AhmedBahet/ng-sub-apps

Hy vọng điều này sẽ giúp

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.