que may have application app angularjs

may - AngularJS Multiple ng-app dentro de una página



ng controller angularjs (11)

Acabo de comenzar a aprender Angular JS y he creado algunas muestras básicas; sin embargo, estoy atascado con el siguiente problema.

He creado 2 módulos y 2 controladores.

shoppingCart -> ShoppingCartController namesList -> NamesController

Hay vistas asociadas para cada controlador. La primera vista se muestra bien, pero la segunda no se está procesando. No hay errores

http://jsfiddle.net/ep2sQ/

Por favor ayudame a resolver este problema.

También existe la posibilidad de agregar consola en la Vista para verificar qué valores pasan desde el Controlador.

por ejemplo, en el siguiente div podemos agregar console.log y dar salida a los valores del controlador

<div ng-app="shoppingCart" ng-controller="ShoppingCartController"> </div>


He modificado tu jsfiddle, puedo convertirme en el módulo superior como rootModule para el resto de los módulos. Debajo de las modificaciones actualizadas en su jsfiddle.

  1. El segundo módulo se puede inyectar en RootModule.
  2. En Html second define ng-app ubicada dentro de Root ng-app.

Updated JsFiddle: http://jsfiddle.net/ep2sQ/1011/


Solo una aplicación se inicializa automáticamente. Otros tienen que inicializarse manualmente de la siguiente manera:

Sintaxis:

angular.bootstrap(element, [modules]);

Ejemplo:

<!DOCTYPE html> <html> <head> <script src="https://code.angularjs.org/1.5.8/angular.js" data-semver="1.5.8" data-require="[email protected]"></script> <script data-require="[email protected]" data-semver="0.2.18" src="//cdn.rawgit.com/angular-ui/ui-router/0.2.18/release/angular-ui-router.js"></script> <link rel="stylesheet" href="style.css" /> <script> var parentApp = angular.module(''parentApp'', []) .controller(''MainParentCtrl'', function($scope) { $scope.name = ''universe''; }); var childApp = angular.module(''childApp'', [''parentApp'']) .controller(''MainChildCtrl'', function($scope) { $scope.name = ''world''; }); angular.element(document).ready(function() { angular.bootstrap(document.getElementById(''childApp''), [''childApp'']); }); </script> </head> <body> <div id="childApp"> <div ng-controller="MainParentCtrl"> Hello {{name}} ! <div> <div ng-controller="MainChildCtrl"> Hello {{name}} ! </div> </div> </div> </div> </body> </html>

angular.bootstrap()


Para ejecutar múltiples aplicaciones en un documento HTML, debe angular.bootstrap() manualmente usando angular.bootstrap()

HTML

<!-- Automatic Initialization --> <div ng-app="myFirstModule"> ... </div> <!-- Need To Manually Bootstrap All Other Modules --> <div id="module2"> ... </div>

JS

angular. bootstrap(document.getElementById("module2"), [''mySecondModule'']);

La razón de esto es que solo una aplicación AngularJS se puede iniciar automáticamente por documento HTML. La primera ng-app encuentra en el documento se usará para definir el elemento raíz como auto-bootstrap como una aplicación.

En otras palabras, si bien es técnicamente posible tener varias aplicaciones por página, solo una directiva ng-app será automáticamente instanciada e inicializada por el marco angular.


Aquí hay un ejemplo de dos aplicaciones en una página html y dos conrollers en una aplicación:

<div ng-app = "myapp"> <div ng-controller = "C1" id="D1"> <h2>controller 1 in app 1 <span id="titre">{{s1.title}}</span> !</h2> </div> <div ng-controller = "C2" id="D2"> <h2>controller 2 in app 1 <span id="titre">{{s2.valeur}}</span> !</h2> </div> </div> <script> var A1 = angular.module("myapp", []) A1.controller("C1", function($scope) { $scope.s1 = {}; $scope.s1.title = "Titre 1"; }); A1.controller("C2", function($scope) { $scope.s2 = {}; $scope.s2.valeur = "Valeur 2"; }); </script> <div ng-app="toapp" ng-controller="C1" id="App2"> <br>controller 1 in app 2 <br>First Name: <input type = "text" ng-model = "student.firstName"> <br>Last Name : <input type="text" ng-model="student.lastName"> <br>Hello : {{student.fullName()}} <br> </div> <script> var A2 = angular.module("toapp", []); A2.controller("C1", function($scope) { $scope.student={ firstName:"M", lastName:"E", fullName:function(){ var so=$scope.student; return so.firstName+" "+so.lastName; } }; }); angular.bootstrap(document.getElementById("App2"), [''toapp'']); </script> <style> #titre{color:red;} #D1{ background-color:gray; width:50%; height:20%;} #D2{ background-color:yellow; width:50%; height:20%;} input{ font-weight: bold; } </style>


Básicamente, tal como lo mencionó Cherniv, tenemos que arrancar los módulos para tener múltiples ng-app dentro de la misma página. Muchas gracias por todas las entradas.

var shoppingCartModule = angular.module("shoppingCart", []) shoppingCartModule.controller("ShoppingCartController", function($scope) { $scope.items = [{ product_name: "Product 1", price: 50 }, { product_name: "Product 2", price: 20 }, { product_name: "Product 3", price: 180 }]; $scope.remove = function(index) { $scope.items.splice(index, 1); } } ); var namesModule = angular.module("namesList", []) namesModule.controller("NamesController", function($scope) { $scope.names = [{ username: "Nitin" }, { username: "Mukesh" }]; } ); angular.bootstrap(document.getElementById("App2"), [''namesList'']);

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.3/angular.min.js"></script> <div id="App1" ng-app="shoppingCart" ng-controller="ShoppingCartController"> <h1>Your order</h1> <div ng-repeat="item in items"> <span>{{item.product_name}}</span> <span>{{item.price | currency}}</span> <button ng-click="remove($index);">Remove</button> </div> </div> <div id="App2" ng-app="namesList" ng-controller="NamesController"> <h1>List of Names</h1> <div ng-repeat="_name in names"> <p>{{_name.username}}</p> </div> </div>


En mi caso, tuve que ajustar el bootstrapping de mi segunda aplicación en angular.element(document).ready para que funcione:

angular.element(document).ready(function() { angular.bootstrap(document.getElementById("app2"), ["app2"]); });


Puede fusionar varios módulos en un módulo raíz y asignar ese módulo como ng-app a un elemento superior, por ejemplo, etiqueta de cuerpo.

código ex:

<!DOCTYPE html> <html> <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script> <script src="namesController.js"></script> <script src="myController.js"></script> <script>var rootApp = angular.module(''rootApp'', [''myApp1'',''myApp2''])</script> <body ng-app="rootApp"> <div ng-app="myApp1" ng-controller="myCtrl" > First Name: <input type="text" ng-model="firstName"><br> Last Name: <input type="text" ng-model="lastName"><br> <br> Full Name: {{firstName + " " + lastName}} </div> <div ng-app="myApp2" ng-controller="namesCtrl"> <ul> <li ng-bind="first">{{first}} </li> </ul> </div> </body> </html>


Puede usar angular.bootstrap() directamente ... el problema es que pierde los beneficios de las directivas.

En primer lugar, debe obtener una referencia al elemento HTML para arrancarlo, lo que significa que su código ahora está acoplado a su HTML.

En segundo lugar, la asociación entre los dos no es tan evidente. Con ngApp puede ver claramente qué HTML está asociado con qué módulo y sabe dónde buscar esa información. Pero angular.bootstrap() podría invocarse desde cualquier lugar de su código.

Si va a hacerlo de la mejor manera, sería usando una directiva. Que es lo que hice. Se llama ngModule . Así es como se vería tu código al usarlo:

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

Puede obtener el código fuente para ello en:

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

Se implementa de la misma manera que ngApp . Simplemente llama a angular.bootstrap() detrás de las escenas.


Puede definir una Root ng-App y en esta ng-App puede definir múltiples nd-Controler. Me gusta esto

<!DOCTYPE html> <html> <script src = "https://ajax.googleapis.com/ajax/libs/angularjs/1.3.3/angular.min.js"></script> <style> table, th , td { border: 1px solid grey; border-collapse: collapse; padding: 5px; } table tr:nth-child(odd) { background-color: #f2f2f2; } table tr:nth-child(even) { background-color: #ffffff; } </style> <script> var mainApp = angular.module("mainApp", []); mainApp.controller(''studentController1'', function ($scope) { $scope.student = { firstName: "MUKESH", lastName: "Paswan", fullName: function () { var studentObject; studentObject = $scope.student; return studentObject.firstName + " " + studentObject.lastName; } }; }); mainApp.controller(''studentController2'', function ($scope) { $scope.student = { firstName: "Mahesh", lastName: "Parashar", fees: 500, subjects: [ { name: ''Physics'', marks: 70 }, { name: ''Chemistry'', marks: 80 }, { name: ''Math'', marks: 65 }, { name: ''English'', marks: 75 }, { name: ''Hindi'', marks: 67 } ], fullName: function () { var studentObject; studentObject = $scope.student; return studentObject.firstName + " " + studentObject.lastName; } }; }); </script> <body> <div ng-app = "mainApp"> <div id="dv1" ng-controller = "studentController1"> Enter first name: <input type = "text" ng-model = "student.firstName"><br/><br/> Enter last name: <input type = "text" ng-model = "student.lastName"><br/> <br/> You are entering: {{student.fullName()}} </div> <div id="dv2" ng-controller = "studentController2"> <table border = "0"> <tr> <td>Enter first name:</td> <td><input type = "text" ng-model = "student.firstName"></td> </tr> <tr> <td>Enter last name: </td> <td> <input type = "text" ng-model = "student.lastName"> </td> </tr> <tr> <td>Name: </td> <td>{{student.fullName()}}</td> </tr> <tr> <td>Subject:</td> <td> <table> <tr> <th>Name</th>. <th>Marks</th> </tr> <tr ng-repeat = "subject in student.subjects"> <td>{{ subject.name }}</td> <td>{{ subject.marks }}</td> </tr> </table> </td> </tr> </table> </div> </div> </body> </html>


var shoppingCartModule = angular.module("shoppingCart", []) shoppingCartModule.controller("ShoppingCartController", function($scope) { $scope.items = [{ product_name: "Product 1", price: 50 }, { product_name: "Product 2", price: 20 }, { product_name: "Product 3", price: 180 }]; $scope.remove = function(index) { $scope.items.splice(index, 1); } } ); var namesModule = angular.module("namesList", []) namesModule.controller("NamesController", function($scope) { $scope.names = [{ username: "Nitin" }, { username: "Mukesh" }]; } ); var namesModule = angular.module("namesList2", []) namesModule.controller("NamesController", function($scope) { $scope.names = [{ username: "Nitin" }, { username: "Mukesh" }]; } ); angular.element(document).ready(function() { angular.bootstrap(document.getElementById("App2"), [''namesList'']); angular.bootstrap(document.getElementById("App3"), [''namesList2'']); });

<!DOCTYPE html> <html> <head> <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script> </head> <body> <div id="App1" ng-app="shoppingCart" ng-controller="ShoppingCartController"> <h1>Your order</h1> <div ng-repeat="item in items"> <span>{{item.product_name}}</span> <span>{{item.price | currency}}</span> <button ng-click="remove($index);">Remove</button> </div> </div> <div id="App2" ng-app="namesList" ng-controller="NamesController"> <h1>List of Names</h1> <div ng-repeat="_name in names"> <p>{{_name.username}}</p> </div> </div> <div id="App3" ng-app="namesList2" ng-controller="NamesController"> <h1>List of Names</h1> <div ng-repeat="_name in names"> <p>{{_name.username}}</p> </div> </div> </body> </html>


<html> <head> <script src="angular.min.js"></script> </head> <body> <div ng-app="shoppingCartParentModule" > <div ng-controller="ShoppingCartController"> <h1>Your order</h1> <div ng-repeat="item in items"> <span>{{item.product_name}}</span> <span>{{item.price | currency}}</span> <button ng-click="remove($index);">Remove</button> </div> </div> <div ng-controller="NamesController"> <h1>List of Names</h1> <div ng-repeat="name in names"> <p>{{name.username}}</p> </div> </div> </div> </body> <script> var shoppingCartModule = angular.module("shoppingCart", []) shoppingCartModule.controller("ShoppingCartController", function($scope) { $scope.items = [ {product_name: "Product 1", price: 50}, {product_name: "Product 2", price: 20}, {product_name: "Product 3", price: 180} ]; $scope.remove = function(index) { $scope.items.splice(index, 1); } } ); var namesModule = angular.module("namesList", []) namesModule.controller("NamesController", function($scope) { $scope.names = [ {username: "Nitin"}, {username: "Mukesh"} ]; } ); angular.module("shoppingCartParentModule",["shoppingCart","namesList"]) </script> </html>