AngularJS + JQuery:如何获得在angularjs中工作的dynamic内容
我正在使用jQuery和AngularJS的Ajax应用程序。
当我使用jQuery的html
函数更新div的内容(包含AngularJS绑定)时,AngularJS绑定不起作用。
以下是我正在尝试做的代码:
$(document).ready(function() { $("#refreshButton").click(function() { $("#dynamicContent").html("<button ng-click='count = count + 1' ng-init='count=0'>Increment</button><span>count: {{count}} </span>") }); });
</style><script src="angular-1.0.1.min.html"></script><style>.ng-invalid { border: 1px solid red; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> <div ng-app=""> <div id='dynamicContent'> <button ng-click="count = count + 1" ng-init="count=0"> Increment </button> <span>count: {{count}} </span> </div> <button id='refreshButton'> Refresh </button> </div>
我有一个dynamic内容的ID与ID #dynamicContent
,我有一个刷新button,刷新点击时,这个div的内容。 如果我不刷新内容,增量将按预期工作,但在刷新后,AngularJS绑定停止工作。
这在AngularJS中可能不是有效的,但是我最初使用jQuery构build应用程序,之后开始使用AngularJS,所以我无法将所有东西都移植到AngularJS中。 任何帮助在AngularJS中得到这个工作是非常感谢。
在将HTML插入到DOM中之前,您需要调用$compile
,这样angular才会有机会执行绑定。
在你的小提琴中,它看起来像这样。
$("#dynamicContent").html( $compile( "<button ng-click='count = count + 1' ng-init='count=0'>Increment</button><span>count: {{count}} </span>" )(scope) );
显然, $compile
必须被注入到你的控制器才能工作。
请阅读$compile
文档 。
如果您不能控制dynamic内容的另一种解决scheme
如果你没有通过一个指令加载你的元素(例如,在注释的jsfiddles中的例子中),这是有效的。
总结你的内容
把你的内容包装在一个div中,这样你可以select它,如果你正在使用JQuery 。 你也可以select使用原生的JavaScript来获取你的元素。
<div class="selector"> <grid-filter columnname="LastNameFirstName" gridname="HomeGrid"></grid-filter> </div>
使用angular度注射器
如果没有,可以使用下面的代码来获得对$ compile的引用。
$(".selector").each(function () { var content = $(this); angular.element(document).injector().invoke(function($compile) { var scope = angular.element(content).scope(); $compile(content)(scope); }); });
概要
原来的文章似乎假设你有一个$编译参考方便。 当你有参考资料时,显然很容易,但是我没有,所以这就是我的答案。
前面的代码的一个警告
如果您在使用minifyscheme时使用了asp.net/mvc包,则在发布模式下进行部署时将遇到麻烦。 麻烦来了未捕获的错误的forms:[$注射器:unpr]这是由狭窄的angular度javascript代码搞乱造成的。
这是解决这个问题的方法 :
用下面的重载代替前面的代码片段。
... angular.element(document).injector().invoke( [ "$compile", function($compile) { var scope = angular.element(content).scope(); $compile(content)(scope); } ]); ...
在我拼凑起来之前,这给我造成了很多的伤痛。
除了@jwize的回答
因为angular.element(document).injector()
给出了错误injector is not defined
所以,我已经创build了可以在AJAX调用后运行或使用jQuery更改DOM时使用的函数。
function compileAngularElement( elSelector) { var elSelector = (typeof elSelector == 'string') ? elSelector : null ; // The new element to be added if (elSelector != null ) { var $div = $( elSelector ); // The parent of the new element var $target = $("[ng-app]"); angular.element($target).injector().invoke(['$compile', function ($compile) { var $scope = angular.element($target).scope(); $compile($div)($scope); // Finally, refresh the watch expressions in the new element $scope.$apply(); }]); } }
通过传递新元素的select器来使用它。 喜欢这个
compileAngularElement( '.user' ) ;