Dans une application à grande échelle, notre application web peut être organisée en pages partielles séparées afin d'augmenter la modularité de notre application. Dans certains cas, la compilation d'une page partielle chargée par XHR ou une requête Ajax en utilisant Angular $http.get ou JQuery $.load introduira une erreur.
En utilisant mon scénario comme exemple, j'utilise exactement le framework PHP Kohana pour pouvoir contrôler la modularité de mon application web au niveau du serveur. Comme d'habitude, tous les modèles et les pages sont séparés en vue, laissant tout le HTML, JS et CSS ensemble sur la couche de présentation.
Cela me donnera une grande flexibilité pour mettre en œuvre la pile Javascript MVW/MVC sur le traitement côté client, car mon application web dépend fortement des requêtes AJAX pour récupérer les données de l'application dorsale. Dans mon scénario, j'utilise AngularJS et voici un pseudo simple sur la façon dont les données du modèle sont présentées au client.
Modèle Kohana > Contrôleur Kohana > Vue Kohana > XHR > JQuery \Angular > DOM
L'une des parties de mon application qui m'a vraiment donné un coup et m'a fait boire quelques bouteilles de boisson métabolique pour résoudre l'application. J'ai un dialogue modal et la page partielle est chargée par XHR depuis le serveur et attachée au DOM sélectionné.
Le problème est que lorsqu'Angular essaie de compiler la page partielle, lorsqu'il trouve la directive ng-controller, il cherche la fonction faisant référence à la directive traitée. Des erreurs sont produites lorsque le contrôleur n'est pas trouvé car il n'a pas encore été évalué par le DOM parser. Mais si vous pré-définissez la fonction quelque part dans votre application juste avant de charger la page partielle, tout est OK. Voici l'exemple de la façon dont j'ai configuré un service de dialogue qui sera appelé à partir de la directive de lien lorsque je clique sur le lien en question.
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 je la partage avec les autres sur ma réponse pour les autres débutants comme moi. (désolé pour mon anglais).