在大规模应用,我们的Web应用程序可能被组织成不同的部分页面,以提高我们的应用程序的模块化。 在某些情况下,编译通过XHR或Ajax请求加载部分页面或者使用角$ http.get或JQuery的$ .load将引入误差。
用我的情况为例,正是我使用Kohana的PHP框架,这样我就可以控制在服务器级别我的web应用程序的模块化。 像往常一样,所有的模板和页面被单独进入视野,使所有HTML,JS和CSS一起表示层。
这将给人一种很大的灵活性,我实现在客户端处理JavaScript的MVW / MVC堆栈我的web应用程序都严重依赖AJAX请求来从后端应用程序的数据。 在我的情况IM使用AngularJS以下是从模型中的数据如何呈现给客户一个简单的假。
Kohana的型号> Kohana的控制器>的Kohana视图> XHR> JQuery的\角> DOM
我的一个在我的应用程序的一部分,真正给我撞,让我喝饮料代谢的几瓶解决应用程序的。 是我通过从服务器XHR有模态对话框和部分页面进行负载,并将其连接到所选的DOM。
问题是,当角尝试编译部分页面,当它发现了NG-控制器指令其将寻找参照处理指令的功能。 误差分别产生,其中,所述控制器被没有发现,因为它尚未通过DOM解析器评价。 但是,当你在你的应用程序当中预delare功能只是你加载之前的部分页面,一切正常。 下面是关于例子,如何我设置了一个对话框,服务将从链接指令,当我点击的链接表示调用。
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,别人JS大师那里可能已经知道了解决方案,非常繁忙,而发明了另一个很酷的Web开发工具和框架与我们分享。 这是确定的,这样就够了。 这可能不是一个很酷的或最后通牒的解决方案,请分享任何改进或提示我们!
为了克服这个问题,我们需要的策略设置,让我用一个例子代码开始这样的信息流通过,而我们的大脑会消化。 下面的代码是我使用jQuery和Ajax的内容会插入创建模态对话框中的占位符。
<div ng-app="asng" id="dialog" title="" style="display:none">
<div id="dialog-content"></div>
</div>
作为一个基本知识,我们要了解如何DOM解析器都在工作。 我们可能会认为DOMP(DOM解析器)是一个多线程的,这就是我们可以并行加载多个外部资源的原因。 实际上DOMP是单线程在解析DOM元素索引从顶部到底部。 下面是我会加载到#对话框的内容DIV元素的部分页面上的例子。
<script language="JavaScript" type="text/javascript">
function Transaction ($scope,$http){
$scope.items = [{"country":"VN","quantity":"100"}];
$scope.country_name = $scope.items;
}
</script>
<style>
</style>
<div id="transaction-panel" class="user" data-ng-controller="Transaction">
<form id="{{ form_name }}" action="">
Country : [[ items.country ]] </br>
Total : [[ items.quantity ]]
</form>
</div>
其实这些部分仍然给了一个错误,虽然我们已经把脚本块只是NG-控制器指令中的元素之前。 其实这不是真正的情况下,我们需要解决的部分是AngularJS如何编译服务正在整理部分DOM。 让我们回到我的问题的一部分上方和检查地方,我们做的事情编译行。
html = $compile(data)(scope);
$('#dialog-content').html(html);
上述第一线将编译DOM中的数据的变量,并插入到根DOM不幸第一线会喊一个错误:未找到控制器事务。
因为没有插入根DOMP这在部分页面尚未被DOMP解析器评估,因为发生, 脚本块 。 现在你看到了光明行,所以我们要改变编译策略一点,通过插入新的DOM,然后我们将解析回插入DOM看看下面的例子: -
html = $('#dialog-content').html(data);
$compile(html)(scope);
斯利姆和简单的解决方案,它敲打早上把我几头解决,只是因为忽略了对DOM解析的简单的概念这个问题。
如果我明白你正在尝试做的,这里有一个简单的例子。
我想通过AJAX张贴到Django的形式,然后替换页面中的内容,因为返回的标记。 返回的标记包括NG-控制器,我需要在加载时执行:
.controller('MyForm', function($element, $compile, $scope){
var scope = $scope;
var $theForm = $element;
var $formBlock = $element.find('.the_form'); // is replaced by the form response
$element.find('.submit_the_form').click(function(){
// submit the form and replace contents of $formBlock
$.post($theForm.attr('action'), $theForm.serialize(), function(response){
var newstuff = $formBlock.html(response);
$compile(newstuff)(scope); // loads the angular stuff in the new markup
});
});
})
我觉得你感兴趣的行是$编译(Newstuff文件)(范围);
编辑:Crikey,与其他标记今早尝试这样做,没有工作,没有任何理由,我可以弄清楚。 原来,如果我没有与分配,在新的标记NG-model的字段,然后在$编译不执行。 添加:
<input type="hidden" name="dummy" value="0" ng-model="dummy"/>
...现在它编译。