Chargement de Page Partielle Angulaire et Compiler Le Contrôleur
À grande échelle d'application, notre application web peut être s'organiser en séparer partielle page pour augmenter la modularité de notre application. Dans certains cas, la compilation partielle page chargée par XHR ou requête Ajax soit à l'aide Angulaire $http.obtenir ou JQuery $.charge d'introduire une erreur.
À l'aide de mon scénario à titre d'exemple, exactement, je suis en utilisant Kohana framework PHP pour que je puisse contrôler la modularité de mon application web sur le serveur. Comme d'habitude, tous les modèles de page et été séparée en vue, en laissant tout le code HTML, CSS et JS ensemble sur la couche de présentation.
Cela donne une grande flexibilité pour moi de mettre en œuvre le Javascript MVW/MVC pile sur le traitement côté client comme mon web app sont fortement dépendent de la requête AJAX pour récupérer les données à partir de l'arrière de la fin de l'application. Dans mon scénario im en utilisant AngularJS et ci-dessous est un simple pseudo sur la manière dont les données à partir du Modèle présenté au client.
Kohana Modèle > Kohana Contrôleur > Kohana View > XHR > JQuery\Angulaire > DOM
Un de ma part dans mon application qui vraiment me donner la bosse et me faire boire quelques bouteilles de métabolisme de la boisson à résoudre l'application. Est l'endroit où j'ai une boîte de dialogue Modale et la page partielle de charge à travers XHR depuis le serveur, et qu'il l'a attaché à certains DOM.
Le problème, c'est quand Angulaire essayez de compiler la page partielle, lorsqu'il a constaté la ng-controller directive, il sera à la recherche de la fonction se référant au traité de la directive. Erreur étaient produire lorsque le responsable du traitement n'est pas trouvé, comme il n'est pas encore évalué par DOM parser. Mais lorsque vous pré-delare la fonction quelque part dans votre application, juste avant votre charge partielle de la page, tout est OK. Ci-dessous l'exemple sur comment je peux configurer une boîte de Dialogue service qui va être appelée à partir du lien de la directive lorsque j'ai cliqué sur le dit lien.
var dialogService = angular.module('dialog.service', []);
dialogService.factory('Dialog', function($http,$compile){
var dialogService = {};
dialogService.load = function(url, scope){
$("#dialog:ui-dialog").dialog( "destroy" );
$("#dialog").attr('title','Atlantis');
$http.get(url).success(function (data) {
html = $compile(data)(scope);
$('#dialog-content').html(html);
$("#dialog").dialog({
width: '600px',
buttons: {
"Ok": function() {
$( this ).dialog( "close" );
return true;
},
},
close: function(){
if (typeof (onClose) == 'function') { onClose(); }
},
});
});
}
return dialogService;
});
Après quelques recherches, j'ai trouvé une solution et de le partager avec les potes sur ma réponse pour les autres débutants comme moi. (désolé pour mon anglais).
Vous devez vous connecter pour publier un commentaire.
Il n'y a rien de mal sur AngularJS sur cette installation, d'autres JS guru y connaissez peut-être la solution, et très occupé pour partager avec nous tout inventer un autre cool outils de développement web ou de cadre. C'est OK continuer à le faire. Ceci peut ne pas être cool ou ultimatum solution, s'il vous plaît partager toute amélioration ou des conseils avec nous!
Pour surmonter ce problème, nous avons besoin de stratégie pour le programme d'installation, permettez-moi de commencer avec un exemple de code de notre cerveau digère bien que l'information qui circule. Code ci-dessous est l'espace réservé où j'ai créer la boîte de dialogue modale à l'aide de JQuery et Ajax le contenu sera insérer.
Comme une base de connaissances, nous devons comprendre comment DOM parser de travail. Nous pourrions penser que le DOMP (DOM Parser) est un multi-thread et c'est la raison pour laquelle nous pouvons nous charger de multiples ressources externes en parallèle. En fait DOMP sont mono-thread lors de l'analyse d'éléments DOM index de haut en bas. Ci-dessous l'exemple sur la page partielle que je vais charger dans #la boîte de dialogue contenu de l'élément DIV.
En fait, ces partielle donne toujours une erreur, même si nous avons mis le bloc de script juste avant l'élément avec ng-controller directive. En fait c'est pas vraiment le cas, la partie qu'il nous faut relever est de savoir comment AngularJS compiler service de compilation partielle DOM. Laissez revenir sur ma question ci-dessus et d'inspecter l'endroit où la ligne que nous ne le compiler chose.
Première ligne ci-dessus pour compiler DOM dans la variable de données, et l'insérer dans la racine DOM malheureusement première ligne de crier une erreur : Contrôleur de Transaction qui n'est pas trouvé.
Faire, car, le Bloc de Script dans votre page partielle n'est pas encore évaluer par le DOMP analyseur de raison n'est pas insérée dans la racine de la DOMP. Maintenant vous pouvez voir la lumière OK, donc nous devons changer la compilation d'une stratégie un peu, par l'insertion de la nouvelle DOM et ensuite, nous allons analyser le dos, l'insertion des DOM regardez l'exemple ci-dessous:-
Slim et la solution la plus simple, il m'a fallu un peu de se cogner la tête le matin pour résoudre ce problème simplement parce qu'ignorant le concept simple sur les DOM de l'analyse.
Si je comprends ce que vous essayez de faire, voici un exemple simple.
Je voulais poster via AJAX pour un Django formulaire, puis remplacez le contenu du formulaire dans la page avec le retour de balisage. Le retour de balisage inclut une ng-controller, dont j'ai besoin pour exécuter lors du chargement:
Je pense que la ligne qui vous intéresse est de $compiler(newstuff)(champ d'application);
EDIT:
Crikey, a essayé avec quelques autres markup ce matin et n'a pas de travail, pour aucune raison que je pouvais comprendre. S'est avéré que si je n'ai pas de champ avec ng-model attribué, dans le nouveau balisage, puis l' $compiler n'est pas exécutée. Ajouté:
...et maintenant, il compile.