Ładowanie częściowej strony za pomocą kątowego i kompilującego kontrolera

W aplikacji na dużą skalę nasza aplikacja internetowa może być zorganizowana w osobną stronę, aby zwiększyć modułowość naszej aplikacji. W niektórych przypadkach skompilowanie częściowej strony załadowanej przez żądanie XHR lub Ajax przy użyciu Angular $ http.get lub JQuery $ .load spowoduje błąd.

Używając mojego scenariusza jako przykładu, dokładnie używam frameworka PHP Kohany, dzięki czemu mogę kontrolować modułowość mojej aplikacji internetowej na poziomie serwera. Jak zwykle cały szablon i strona zostały rozdzielone w widoku, pozostawiając wszystkie HTML, JS i CSS razem w warstwie prezentacji.

To da mi dużą elastyczność w implementacji stosu Javascript MVW / MVC na przetwarzanie po stronie klienta, ponieważ moja aplikacja internetowa w dużym stopniu zależy od żądania AJAX pobrania danych z aplikacji zaplecza. W moim scenariuszu za pomocą AngularJS i poniżej znajduje się prosty pseudo na temat tego, jak dane z Modelu są prezentowane klientowi.

Kohana Model> Kohana Controller> Kohana View> XHR> JQuery Angular> DOM

Jedna z moich części w mojej aplikacji, która naprawdę daje mi uderzenie i każe mi wypić kilka butelek napoju metabolicznego, aby rozwiązać aplikację. Czy mam okno dialogowe Modal, a częściowa strona jest ładowana przez XHR z serwera i dołączana do wybranego DOM.

Problem polega na tym, że Angular próbuje skompilować częściową stronę, gdy znajdzie dyrektywę ng-controller, będzie szukał funkcji odwołującej się do przetworzonej dyrektywy. Wystąpił błąd, gdy kontroler nie został znaleziony, ponieważ nie został jeszcze oceniony przez parser DOM. Ale gdy wstępnie usuniesz funkcję gdzieś w aplikacji, tuż przed załadowaniem częściowej strony, wszystko jest w porządku. Poniżej znajduje się przykład konfiguracji usługi Dialog, która będzie wywoływana z dyrektywy łącza, gdy kliknęłam wspomniany link.

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;
});

Po kilku badaniach znalazłem jakieś rozwiązanie i udostępniłem je koleżankom na mojej odpowiedzi dla innych początkujących jak ja. (przepraszam za mój angielski).

questionAnswers(2)

yourAnswerToTheQuestion