首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AngularJS + JQuery :如何让动态内容在angularjs中工作

AngularJS + JQuery :如何让动态内容在angularjs中工作
EN

Stack Overflow用户
提问于 2012-08-02 13:25:47
回答 3查看 102.5K关注 0票数 84

我正在开发一个同时使用jQuery和AngularJS的Ajax应用程序。

当我使用jQuery的html函数更新div的内容(包含AngularJS绑定)时,AngularJS绑定不起作用。

下面是我正在尝试做的代码:

代码语言:javascript
复制
$(document).ready(function() {
  $("#refreshButton").click(function() {
    $("#dynamicContent").html("<button ng-click='count = count + 1' ng-init='count=0'>Increment</button><span>count: {{count}} </span>")
  });
});
代码语言:javascript
复制
</style><script src="http://docs.angularjs.org/angular-1.0.1.min.js"></script><style>.ng-invalid {
  border: 1px solid red;
}
代码语言:javascript
复制
<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>

我在一个ID为#dynamicContent的div中有动态内容,并且我有一个刷新按钮,当单击刷新时,它会更新这个div的内容。如果我不刷新内容,增量就会按预期工作,但是在刷新之后,AngularJS绑定就停止工作了。

这在AngularJS中可能无效,但我最初使用jQuery构建应用程序,后来开始使用AngularJS,因此我不能将所有内容都迁移到AngularJS。对于在AngularJS中实现这一功能的任何帮助,我们都非常感谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-02 23:17:33

在将HTML字符串插入到DOM之前,需要对其调用$compile,以便angular有机会执行绑定。

在你的小提琴里,它看起来像这样。

代码语言:javascript
复制
$("#dynamicContent").html(
  $compile(
    "<button ng-click='count = count + 1' ng-init='count=0'>Increment</button><span>count: {{count}} </span>"
  )(scope)
);

显然,必须将$compile注入到您的控制器中,这样才能正常工作。

$compile documentation中阅读更多内容。

票数 115
EN

Stack Overflow用户

发布于 2014-06-05 19:15:08

在您无法控制动态内容的情况下使用另一种解决方案

如果你没有通过一个指令来加载你的元素,这是可行的。如注释jsfiddles中的示例所示)。

总结您的Content

将内容包装在div中,以便在使用JQuery时可以选择它。你也可以选择使用原生javascript来获取你的元素。

代码语言:javascript
复制
<div class="selector">
    <grid-filter columnname="LastNameFirstName" gridname="HomeGrid"></grid-filter>
</div>

使用Angular Injector

如果您没有$compile的引用,可以使用以下代码来获取它的引用。

代码语言:javascript
复制
$(".selector").each(function () {
    var content = $(this);
    angular.element(document).injector().invoke(function($compile) {
        var scope = angular.element(content).scope();
        $compile(content)(scope);
    });
});

摘要

最初的帖子似乎假设你手头有一个$compile参考资料。当你有参考资料时,这显然是很容易的,但我没有,所以这是我的答案。

对前面的代码的一个警告

如果你正在使用一个带有minify方案的asp.net/mvc捆绑包,当你在发布模式下部署时,你会遇到麻烦。问题以未捕获的错误:$injector:unpr的形式出现,这是由minifier扰乱angular javascript代码引起的。

这里是补救它的方法:

用下面的重载替换前面的代码段。

代码语言:javascript
复制
...
angular.element(document).injector().invoke(
[
    "$compile", function($compile) {
        var scope = angular.element(content).scope();
        $compile(content)(scope);
    }
]);
...

在我把它拼凑起来之前,这给我造成了很大的痛苦。

票数 57
EN

Stack Overflow用户

发布于 2015-11-05 15:26:26

对@jwize答案的补充

因为angular.element(document).injector()给出了错误injector is not defined So,所以我创建了一个函数,您可以在调用AJAX之后或使用jQuery更改DOM时运行该函数。

代码语言:javascript
复制
  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();
                    }]);
            }

        }

通过只传递新元素的选择器来使用它。像这样

代码语言:javascript
复制
compileAngularElement( '.user' ) ; 
票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11771513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档