AngularJS: Comment imbriquer des applications au sein de l'angulaire de l'app
j'ai travaillé sur un projet qui est plus comme un cadre, et dispose de plusieurs applications /modules que vous pouvez installer. Le voir comme une base de l'appstore ou google.play store. C'est en quelque sorte d'une application intranet, et tous les modules peuvent être ajoutés à votre compteutilisateur.
le cadre est déjà en cours de développement, mais je suis enveloppant ma tête autour des applications/modules idée maintenant. (lien vers une preuve de concept en développement, peuvent être trouvés ici)
une application devrait être un peu autonome, et de ne pas pouvoir soudain inclure des scripts à partir du cadre, C'est parfaitement possible, par la structuration en modules séparés comme suit:
angular.module('myApp', []);
cependant, une application peut avoir des modèles, des scripts, css et il peut fonctionner sur un serveur distinct, de sorte que je suis une sorte de recherche de la meilleure façon de récupérer le script(s) et cssfile(s) et de façon dynamique les charger dans l'application lorsque l'utilisateur démarre le app
dans de dans le cadre.
- actuellement, je suis à la structuration des applications comme si ils ont un template principal par exemple
www.framework.com/apps/myapp/views/app.html
, par souci de simplicité, j'ai bundle scripts dans 1 fichier de script par demande, donc il est aussi unwww.framework.com/apps/myapp/script.js
être inclus.
Le cadre contient un modèle qui se charge des applications, et une appController
. Le modèle contient cette pièce:
<div data-ng-controller="AppController" data-ng-include="app.appTemplate">
<div>loading...</div>
</div>
en fait cela se lie à la $scope.app.appTemplate
qui est mis à jour quand tous les scripts sont chargés, alors d'abord il montre un chargement du modèle, plus tard, après les scripts sont inclus dans la page des mises à jour de la app.appTemplate
de l'mentionnés ci-dessus template principal d'une application.
lors du chargement du premier index de modèle fonctionne, ce modèle est actuellement chargé avec le AppController
du cadre, c'est donc à l'aide de la $scope
du cadre et pas de son propre script.
J'ai encore à une certaine façon de démarrer l'application angulaire du module, et de le laisser sur son propre sans l'exécution de quoi que ce soit dans le cadre de travail"
Je suis encore de comprendre la meilleure façon de charge charge les fichiers javascript (va probablement utiliser requrejs ou toute autre dépendance chargeur) mais je n'ai actuellement aucune idée de comment 'boot' l'application sans travailler de la dans le cadre du AppController
MODIFIER
J'ai créé un petit projet de démonstration pour montrer les problèmes à portée de main, le code complet est visible à git-hub pour l'instant, ce projet n'est quelques choses codé en dur, l'idée serait que je fais de moins codé en dur lorsque j'arrive à la preuve de concept bien, maintenant il est tout au sujet de chargement des applications dans le cadre. si c'est possible, je ne peux penser à où obtenir les URL et les noms des applications de ...
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas démarrer un module à l'intérieur d'un autre bootstrap module. L'amorçage compile le point de vue et se lie à un rootScope à elle, parcourant un chemin à travers les DOM et la configuration de la portée des liaisons et de l'exécution de la directive de liaison de fonctions tout le chemin à travers. Si vous n'avez que deux fois, vous allez rencontrer des problèmes.
Vous allez probablement avoir à repenser votre architecture. Je pense que peut-être le mot "module" ou "app" comme il concerne Angulaire est un terme impropre et vous conduit dans la mauvaise voie.
Chaque "utilisateur de l'application installée" dans votre application devrait probablement vraiment être contrôlées par un contrôleur dans votre application module, ou inscrit à un module référencées par votre application module. Vous ne devez pas être "à partir de plusieurs applications", vous auriez vraiment juste de commencer un, le référencement, les autres modules, puis à l'aide de Contrôleurs à partir de ces modules de contrôler les parties de votre point de vue sur l'écran.
De ce que vous pouvez faire, c'est quand un nouveau "widget" a été installé, vous êtes enregistrer le fichier de module (.js) avec le système, qui contient un contrôleur nommé WidgetCtrl, puis lorsque votre page est chargée, vous feriez référence du widget du module sur votre application module. À partir de là, il devrait être disponible pour l'attribution dynamique d'éléments à l'aide de ng-controller et/ou ng-include.
J'espère qu'un sens.
framework
module, et, parmi les dépendances est uneframework.applications
module. maintenant, quand nous charger dynamiquement les scripts pour une application, il se lie contrôleurs à ce cadre.module applications. (via le$controllerProvider.register()
fonction. donc, fondamentalement, nous avons restructuré notre architecture comme vous l'avez dit, d'avoir des contrôleurs être l'application de la logique, et ne pas avoir un module par application.app4
à un certain point de montage (domain.com/app4
), comment voulez-vous configurer toutes ses routes?Contrairement à actuellement accepté de répondre, Il est effectivement possible.
Je travaillais sur un problème similaire et les réponses proposées n'est pas acceptable dans mon cas. J'avais déjà écrit des pages avec de multiples applications, mais c'était il y a des années et des applications étaient indépendants les uns des autres. Il y a deux choses à faire en gros:
Il y a un ng-non reliables attribut qui indique simplement AngularJS d'ignorer l'élément. Cela gère notre premier problème.
Cependant lorsque vous essayez d'amorçage de l'élément enfant; AngularJS lèvera une erreur, vous dire qu'il est déjà démarré (au moins pour moi, la version 1.2.13). Astuce fait le travail:
Cette solution n'est pas parfaite. Idéalement, ng-non-attribut peut être liée pouvez ajouter des données-$injecteur attribut à l'élément. Je vais faire un long et espérons-le, un pull request à AngularJS.
Je n'ai pas eu la chance de faire une pull request. Apparemment, et évidemment, je dois dire, certains internes ont changé, mais ng-non reliables travaille toujours à la version 1.3.13 à l'aide de Ventzy Kunev du code de démonstration (merci encore, voir le lien ci-dessous).
data-$injector
(Angulaire 1.3). Sans cette solution, je n'ai jamais eu de directives dans les applications de travail - merci beaucoup!Error: [ng:btstrpd] App Already Bootstrapped with this Element '<div id="viewAppDiv">'
... quelqu'un d'autre a eu ce problème?ng-non-bindable
fonctionne toujours, maisdata-$injector=""
est cassé. L'élément de l'injecteur est remis quelque part dans Angulaire interne, même si vous essayez de programmation pour l'annuler.bien si chaque sous-app est dans son propre module, vous pouvez simplement utiliser angulaire.bootstrap pour charger ce module de manière dynamique. lorsque l'url d'une application spécifique des charges, vous pouvez récupérer le script nécessaire(s), puis, lorsque la promesse de se résout, vous pouvez faire quelque chose le long des lignes de:
espère que cette aide
framework.appController
, celui qui vérifie la$routeParam
et charge les scripts avec des promesses, qui les uns après les scripts sont chargés exécute:angular.bootstrap($('#application-container'), [$scope.app.name]);
la#application-container
est présent dans le code html chargé DANS l'application, et l'application.le nom est le même que le nom du module. mais ce n'est manifestement pas faire l'affaire. l'application du modèle ne peut pas trouver le contrôleur de charge.Similaire à UnicodeSnowman la réponse ci-dessus, une autre solution qui semble travailler pour mes besoins (j'ai construit un live Angulaire de l'éditeur sur un site de documentation) est de gérer manuellement le processus de démarrage en ayant un
<div id="demos">
qui est séparée de la principale<div id="myApp">
.Cet article a été très utile pour le faire fonctionner correctement.
Processus Général
ng-app
pour cette partie)someCoolDemoContainer
Exemple de Code (pas testé; montre juste les processus de base)
Je sais que c'est assez vieux maintenant, mais je cherchais un moyen pour intégrer une application AngularJS dans Angulaire application et utilisé les réponses de ce post pour le faire donc je pensais que je poste le plunker ici pour quelqu'un d'autre la recherche d'une solution similaire.
Il y avait deux façons que j'ai trouvé pour le faire, à la fois utilisé manuel d'amorçage de la angularjs app au sein de la ngOnInit d'une composante Angulaire:
L'ensemble de la ngNonBindable l'attribut de l'élément qui sera amorcé:
Ou d'injecter de l'angularjs modèle html dans l'élément dans la ngOnInit gestionnaire d'événement à l'intérieur d'une composante Angulaire de sorte que Angulaires ne pas essayer d'interpréter le code AngularJS (surtout interpolation de AngularJS propriétés dans les DOM avec les accolades) lors de la compilation.
La Plunker est ici:
http://plnkr.co/plunks/0qOJ6T8roKQyaSKI