<div ng-app="myApp"> {{ 2 + 2 }} </div>
AngularJS不知道我已经更新了DOM.我看到的内容实际上是{{2 2}}.如果我重新加载页面,表达式会评估,我会看到我想要的值4.
我如何要求AngularJS评估我通过非Angularian方法粗暴强迫DOM的内容?
这是一个小提琴:http://jsfiddle.net/4zRTH/
编辑
@tasseKATT的答案非常适合简单的表达式,但我无法访问控制器.我有一个NotesController,我正在导入的代码需要访问.更多的东西:
<div ng-controller="NotesController"> {{ notes.length }} </div>
我更新了小提琴,所以它更符合我要做的事情:http://jsfiddle.net/5Xhs9/4/
解决方法
$apply() is used to execute an expression in angular from outside of
the angular framework. (For example from browser DOM events,
setTimeout,XHR or third party libraries). Because we are calling into
the angular framework we need to perform proper scope life cycle of
exception handling,executing watches.
在您的示例中,应用程序甚至没有自举,因此您需要:
1)选择元素:
var dynamicContent = "<div id='someId' ng-app> {{ 2 + 2 }} </div>"; $('.expression').html(dynamicContent); var element = angular.element(document.querySelector('#someId'));
2)引导它:
angular.bootstrap(element,[]);
3)检索范围:
var elementScope = element.scope();
4)致电$apply:
elementScope.$apply();
编辑新方案:
在您的新示例中,您已将ng-app“myApp”添加到现有div中,因此AngularJS将为您引导您的应用程序,现在您想要动态添加此内容:
<div id='notes' ng-controller='NotesController'> {{ notes.length }} </div>
您已经定义了NotesController并将其添加到模块中.你现在可以做的是:
1)检索$injector服务:
var $injector = angular.element(document.querySelector('.container')).injector();
2)使用$injector编译新添加的元素并将其链接到其范围.致电$apply:
var element = angular.element(document.querySelector('#notes')); $injector.invoke(function($compile) { var scope = element.scope(); $compile(element)(scope); scope.$apply(); });
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。