在大規模應用程序中,我們的Web應用程序可能會組織成單獨的部分頁面,以增加應用程序的模塊性。在某些情況下,使用Angular $ http.get或JQuery $ .load編譯通過XHR或Ajax請求加載的部分頁面將引入錯誤。使用Angular加載部分頁面並編譯控制器
以我的場景爲例,我恰好使用Kohana PHP框架,所以我可以在服務器級別控制我的Web應用程序的模塊性。像往常一樣,所有的模板和頁面都被分離到視圖中,將所有的HTML,JS和CSS留在表示層上。
這將爲我在客戶端處理上實現Javascript MVW/MVC堆棧提供很大的靈活性,因爲我的web應用程序嚴重依賴AJAX請求從後端應用程序獲取數據。在我的情況下,使用AngularJS和下面是一個簡單的僞如何從模型呈現給客戶端的數據。
Kohana的型號> Kohana的控制器>的Kohana視圖> XHR> JQuery的\角> DOM
我的一個在我的應用程序部分,真正給我撞,讓我喝代謝喝幾瓶解決應用程序。在哪裏我有一個模式對話框,部分頁面通過XHR從服務器加載並將其連接到選定的DOM。
問題是,當Angular嘗試編譯部分頁面,當它發現ng-controller指令時,它將查找引用已處理指令的函數。由於DOM解析器尚未評估控制器,因此產生錯誤。但是,當您在加載部分頁面之前在應用程序的某個地方預先放置函數時,一切正常。下面是我如何設置一個Dialog服務的例子,當我點擊上述鏈接時,會從鏈接指令中調用它。
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;
});
經過一番研究,我發現了一些解決方案,並與我的回答分享給我,像我這樣的初學者。 (對不起我的英語不好)。
我想使用這種方法,但它告訴我$編譯沒有定義,我是否需要添加別的東西? –
我需要知道你如何初始化AngularJS,你能分享到JsFiddle嗎? – wajatimur
代碼示例在網站中很清楚,使用 http://jsfiddle.net/9mPGB/ –