【发布时间】:2013-12-18 06:59:18
【问题描述】:
对于这种情况,我有一个带有一些 AngularJS 指令、控制器等的 HTML 页面。
类似这样的:
<html>
<body>
<div ng-controller="myCtrl">
<ul><li ng-repeat="item in items">{{item.name}}</li></ul>
</div>
<div class="placeholder">
...new HTML here...
</div>
</body>
</html>
请注意,页面上没有 ng-app 指令。我不依赖自动引导,而是使用手动引导方法。
angular.bootstrap(document, ['myApp']);
首先,我创建了将被引导到文档的模块。然后在加载动态确定的依赖项列表时,我附加一些服务、控制器等。一切准备就绪后,我调用引导方法。
这一切都很好,直到 AngularJS 之外的 JavaScript 在 ...new HTML here... 位置附加到 DOM。 AngularJS 不处理新的 HTML。
我的理解是你需要调用$scope.$apply() 或$digest() 或其他东西来让AngularJS 识别新的HTML。但是,在我的示例中,新的 HTML 周围没有控制器。传入的 HTML 可能如下所示:
<div ng-controller="myOtherCtrl">
<h2>{{model.title}}</h2>
</div>
换句话说,它依赖于应用模块中的不同控制器。
- 我无法再次调用
angular.bootstrap方法,因为页面已经绑定。 - 我不能从控制器内部调用
$scope.$apply,因为关键是控制器代码没有被调用。 - 我看不到获取控制器引用以重新应用或刷新它的方法。
我已经阅读了Ifeanyi Isitor lazy loading post 和Ben Nadel post,但它们似乎没有解决在现有控制器的上下文之外加载的 HTML。
我不能选择使用 AngularJS 指令来处理 DOM 操作。它是架构的一个独立部分,它使用 ExtJS 作为注入新 DOM 元素的框架。这意味着我不能使用 ngInclude 例如。
看起来我可以打电话给angular.module('myApp').$refresh(); 或.$apply(),但这不是一个选择。我错过了什么?
【问题讨论】:
-
我没有任何同时使用 extJS 和 angular 的经验,所以恐怕我不能再帮你了。不过要记住一件事,AngularJS 和 ExtJS 都是设计为 webapp 需要的唯一框架的框架。使用两个框架意味着每个客户端都必须下载更多数据,这通常是有问题的,尤其是在移动设备上。看看您是否可以将应用程序的 ExtJS 部分转换为 angularjs,反之亦然。
-
ExtJS 仅在创作体验期间发挥作用,我无法选择删除它。我想使用 Angular 的模块化、双向绑定、可测试性等。在这种情况下,ExtJS 所做的只是将一些 HTML 渲染到 DOM 中的某个位置。让 Angular 认识到发生了变化似乎是一个挑战。
标签: javascript angularjs