Bir sayfada iki açısal uygulama / modül nasıl tanımlanır?


118

Bir sayfaya iki açısal uygulama / modül eklemeye çalışıyorum. Aşağıdaki kemanlarda, yalnızca html kodunda belirtilen ilk modülün her zaman doğru çalıştığını, ancak ikincisinin açısal olarak tanınmadığını görebilirsiniz.

Bu kemanla sadece doSearch2yöntemi uygulayabiliriz , oysa bu kemanla sadece doSearchyöntem doğru çalışır.

Bir sayfaya iki açısal modülü nasıl doğru şekilde yerleştireceğimi arıyorum.

Yanıtlar:


123

HTML belgesi başına yalnızca bir AngularJS uygulaması otomatik olarak önyüklenebilir. Belgede bulunan ilk ngApp, bir uygulama olarak otomatik önyükleme yapmak için kök öğeyi tanımlamak için kullanılacaktır. Bir HTML belgesinde birden çok uygulamayı çalıştırmak için, bunun yerine angular.bootstrap kullanarak bunları manuel olarak önyüklemelisiniz. AngularJS uygulamaları birbirinin içine yerleştirilemez. - http://docs.angularjs.org/api/ng.directive:ngApp

Ayrıca bakınız


@MarkRajcok Öyleyse HTML belgesi başına yalnızca bir modülün olması iyi bir uygulama mı? Ana AngularJS sayfa kümelerindeki "Bir Arka ng-app="project"Uç Bağla " örneği ve "bu, sayfanın farklı bölümlerinde çalışan modüllere sahip olmanıza izin verir" diyor, ancak ngApp belgesi "HTML belgesi başına yalnızca bir yönerge kullanılabilir" diyor.
theblang

9
@mattblang, modüller Angular uygulamalarla ilişkilidir ve gerçekten HTML belgeleri değildir. Normalde sayfa / belge başına yalnızca bir uygulamaya ihtiyacınız vardır, ancak aynı sayfada / belgede birden fazla Angular uygulama (her biri bir veya daha fazla modül kullanabilir) çalıştırmak istiyorsanız, her birini manuel olarak önyüklemeniz gerekir - - kullanmayın ng-app(çünkü işe yaramayacaktır). ng-appHTML belgesi başına yalnızca bir kez kullanılabilir. Sayfada yalnızca bir uygulamanız varsa, bu normal bir durumdur.
Mark Rajcok

1
Bunun bir örneği var mı? Kısa boostrap api belgelerini görüyorum, ancak çalışmasını sağlayamıyorum. Bunu bir süredir googledim ve çalışan tek bir örnek yok gibi görünüyor. Ek olarak, bu rotalarla nasıl çalışır? Açıkçası bir çarpışma sorunu var.
Robert Christian

Ayrıca, ng-app kullanmanın başka bir geliştiriciye tam olarak sayfanın hangi bölümünün hangi modül tarafından kontrol edildiğini göstermesini gerçekten seviyorum. Bunu başarmak için sayfadaki işaretlemeyi kullanmanın bir yolu yok mu? Ya da en azından işaretlemede biraz ipucu?
chrismarx

1
Ng-app yönergesinin ilk iki paragrafı her şeyi
simo

38

ngAppSınırlamaları olmayan alternatif bir yönerge oluşturdum . Denir ngModule. Kodunuzu kullandığınızda şöyle görünecektir:

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

Kaynak kodunu şu adresten alabilirsiniz:

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

AngularJS tarafından dahili olarak sınırlamalar olmaksızın kullanılan kodun aynısıdır.


luisperezphd: Blog yazınızı okudum. Uygulamaları iç içe yerleştirmenin (örn. AJAX yüklü bir widget içeren bir widget oluşturucu) veya bir sayfada zaten bir uygulama olup olmadığını tespit etmenin ve ilkine bağımlı olarak başka bir uygulamayı enjekte etmenin herhangi bir yolu var mı? Ben sadece tam olarak neyi başarmaya çalıştığımla ilgili daha fazla ayrıntıyla sorumu burada yayınladım . Teşekkürler!
Daniel Bonnell

@ACIDSTEALTH AngularJS öğesinin zaten önyüklenmiş olduğunu bildiriyor olması, bunu söylemenin bir yolu olduğu anlamına gelir - ancak bu kod AngularJS için dahili olabilir. Bunu bulmak için AngularJS'nin küçültülmemiş sürümüne ve bu hatadaki kesme noktasına başvurarak if koşulunu görebilirsiniz. StackOverflow soru bağlantınızdan anlayabildiğim kadarıyla, çalışma zamanında bir modülü dinamik olarak "enjekte etmek" istediğiniz gibi görünüyor. Öyleyse bu makaleye bir göz atmak isteyebilirsiniz: weblogs.asp.net/dwahlin/…
Luis Perez

Hey @LuisPerez, web sitenizi kontrol ettim. Makinemde yoruldum. angularJS, "ng-modülleri" / "ng-modülü" algılamıyor. Dosyamda herhangi bir referansa ihtiyacım var mı?
sujay kodamala

Evet @sujaykodamala, ngModule AngularJS'de yerleşik değil, benim oluşturduğum bir yönerge. GitHub'dan indirebilirsiniz. Burada bulabilirsiniz: github.com/luisperezphd/ngModule
Luis Perez

Merhaba @Luis Perez! Blog gönderinizi kontrol ediyordum ve gerçekten harikalar. Zamanınız varsa, lütfen bir sorunu çözmek için buradaki yazıma bakar mısınız - stackoverflow.com/questions/46952478/… . Teşekkürler.
user8512043

19

Neden birden fazla [ng-app] kullanmak istiyorsunuz? Angular modüller kullanılarak sürdürüldüğünden, birden çok bağımlılık kullanan bir uygulama kullanabilirsiniz.

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>

DÜZENLE

Denetleyicinin içinde denetleyiciyi kullanmak istiyorsanız, denetleyici gibi sözdizimini kullanmanız gerektiğini unutmayın:

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

Yakalanmamış Hata: [$ injector: modulerr] errors.angularjs.org/1.3.14/$injector/…… criptMinification% 2Fbower_components% 2Fangular% 2Fangular.min.js% 3A17% 3A381)
Anandaraja_Srinivasan

2 modülün sırasını tersine çevirmeyi denediniz mi? ('App'den önce' otherModule ') Çünkü bu çözümü çok kullanıyorum ve mükemmel çalışıyor ...
Maymun Keşiş

1
Tamam ! Sağladığım Javascript örneğinde bir hata gördüm. Sanırım şimdi düzeltildi! Kayıt için, aynı modül için 2 yerde setter sözdizimini kullandım ... ki buna kesinlikle izin verilmiyor! :-)
Maymun Keşiş

bunu yapmak için 'poz verme şeklimiz
Harry Bosh

9

Birden çok açısal uygulamayı önyükleyebilirsiniz, ancak:

1) Bunları manuel olarak önyüklemeniz gerekir

2) Kök olarak "belge" kullanmamalısınız, ancak açısal arayüzün bulunduğu düğümü:

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

Bu güvenli olur.


3

Manuel önyükleme, her iki modül de çalışacaktır. Şuna bak

  <!-- 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']);
});

İşte Plunker'ın bağlantısı http://plnkr.co/edit/1SdZ4QpPfuHtdBjTKJIu?p=preview

NOT: html'de yok ng-app. idonun yerine kullanıldı.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.