在大规模应用程序中,我们的 Web 应用程序可能会被组织成单独的部分页面,以增加我们应用程序的模块化。在某些情况下,使用 Angular $http.get 或 JQuery $.load 编译通过 XHR 或 Ajax 请求加载的部分页面会引入错误。
以我的场景为例,我正在使用 Kohana PHP 框架,因此我可以在服务器级别控制我的 Web 应用程序的模块化。像往常一样,所有模板和页面都分开显示,将所有 HTML、JS 和 CSS 放在表示层上。
这将为我在客户端处理上实现 Javascript MVW/MVC 堆栈提供很大的灵活性,因为我的 Web 应用程序严重依赖 AJAX 请求来从后端应用程序获取数据。在我使用 AngularJS 的场景中,下面是关于如何将模型中的数据呈现给客户端的简单伪代码。
Kohana 模型 > Kohana 控制器 > Kohana 视图 > XHR > JQuery\Angular > DOM
我在我的应用程序中的一个部分,真的让我大吃一惊,让我喝了几瓶新陈代谢饮料来解决应用程序。是我有一个模态对话框的地方,部分页面通过 XHR 从服务器加载并将其附加到选定的 DOM。
问题是当 Angular 尝试编译部分页面时,当它找到 ng-controller 指令时,它将寻找引用已处理指令的函数。由于 DOM 解析器尚未对其进行评估,因此在未找到控制器的情况下会产生错误。但是,当您在加载部分页面之前在应用程序中的某个位置预先声明该功能时,一切正常。下面是我如何设置对话框服务的示例,当我单击所述链接时,该服务将从链接指令中调用。
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;
});
经过一些研究,我找到了一些解决方案,并与其他人分享我对像我这样的初学者的回答。(对不起我的英语不好)。